为什么这种从double到int的转换不起作用?

问题描述

| 我一直在寻找适当的解释为什么会发生这种情况,但仍然不是很了解,因此,如果这是重新发布,我深表歉意。
#include <iostream>
int main()
{
    double x = 4.10;
    double j = x * 100;

    int k = (int) j;

    std::cout << k;
 }

 Output: 409
我似乎无法用任何其他数字来复制此行为。即,用该格式的任何其他数字替换4.10,输出正确。 肯定有某种我不了解的低级转换内容。 谢谢!     

解决方法

4.1不能精确地由ѭ1表示,它的近似值略小一些:
double x = 4.10;
printf(\"%.16f\\n\",x);  // Displays 4.0999999999999996
所以
j
会比410(即409.99 ...)小得多。转换为
int
会舍弃小数部分,因此得到409。 (如果您想要另一个表现出类似行为的数字,则可以尝试8.2或16.4或32.8 ...看到模式吗?) 必填链接:每位计算机科学家都应了解的浮点算法。     ,解决方法
int k = (int)(j+(j<0?-0.5:0.5));
逻辑 您遇到数字基数问题。 尽管在屏幕上显示4.10是十进制,但编译后将其表示为二进制浮点数,而.10不能完全转换为二进制,最后得到4.099999。 将409.999 ...强制转换为int只会丢弃数字。如果在强制转换为int之前加上0.5,则有效地舍入为最接近的数字或410(409.49将变为409.99,强制转换为409)     ,尝试这个。
#include <iostream>
#include \"math.h\"
int main()
{
double x = 4.10;
double j = x * 100;

int k = (int) j;

std::cout << trunc(k);
std::cout << round(k);
}