2011-05-02 85 views
9

我一直在全面寻找适当的解释,为什么会发生这种情况,但仍然没有真正理解,所以我很抱歉,如果这是一个转发。为什么这个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,并且输出是正确的。

必须有某种我不理解的低级转换的东西。

谢谢!

+0

[C++中奇怪的double到int转换行为] /stackoverflow.com/questions/1860783/strange-double-to-int-conversion-behavior-in-c) – 2011-05-02 01:49:38

+1

它只是让我的头旋转试图围绕某人报告这样的问题,而没有提供他们什么问题的信息是具有。 – 2011-05-02 02:03:14

回答

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

+0

感谢您的解释和良好的联系。 – Koma 2011-05-02 07:37:09

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); 
} 
3

的修复

int k = (int)(j+(j<0?-0.5:0.5)); 

逻辑

您在使用数个碱基的问题。

虽然屏幕上,4.10是一个小数,编译后,它被表述为二进制浮点数字,和0.10不准确转换成二进制,并且你最终4.099999 ....

铸造409.999 ...到int只是删除数字。如果您在投射到int之前添加0.5,那么它实际上会舍入到最接近的数字,或410(409.49将转换为409.99,转换为409)

+1

我自己使用了这个非常简单的舍入公式,但它对于负数不太适用。 – 2011-05-02 03:34:57

+0

@Mark将修复编辑 – 2011-05-02 03:37:04

+0

谢谢!肯定会使用这个。 – Koma 2011-05-02 07:39:04