为什么这个double to int转换不起作用?

时间:2011-05-02 01:42:16

标签: c++ type-conversion

我一直在寻找一个正确的解释,为什么会发生这种情况,但仍然没有真正理解,所以如果这是一个转贴,我会道歉。

#include <iostream>
int main()
{
    double x = 4.10;
    double j = x * 100;

    int k = (int) j;

    std::cout << k;
 }

 Output: 409

我似乎无法用任何其他数字复制此行为。也就是说,将4.10替换为该表单中的任何其他数字,输出正确。

必须有一些我不理解的低级别转换。

谢谢!

3 个答案:

答案 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);
}