我一直在寻找一个正确的解释,为什么会发生这种情况,但仍然没有真正理解,所以如果这是一个转贴,我会道歉。
#include <iostream>
int main()
{
double x = 4.10;
double j = x * 100;
int k = (int) j;
std::cout << k;
}
Output: 409
我似乎无法用任何其他数字复制此行为。也就是说,将4.10替换为该表单中的任何其他数字,输出正确。
必须有一些我不理解的低级别转换。
谢谢!
答案 0 :(得分:17)
4.1无法用double
精确表示,它会被稍微小一些的东西近似:
double x = 4.10;
printf("%.16f\n", x); // Displays 4.0999999999999996
所以j
会比410略微小一些(即409.99 ......)。转换为int
会丢弃小数部分,因此您将获得409。
(如果你想要另一个表现出类似行为的数字,你可以尝试8.2,或16.4或32.8 ......看模式?)
强制性链接:What Every Computer Scientist Should Know About Floating-Point Arithmetic。
答案 1 :(得分:3)
修复
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)
答案 2 :(得分:1)
试试这个。
#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);
}