问题描述
|
我一直在寻找适当的解释为什么会发生这种情况,但仍然不是很了解,因此,如果这是重新发布,我深表歉意。
#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);
}