2014-12-26 298 views
5

为什么这个断言失败?为什么不能!int()正常工作?

import std.conv; 

void main() 
{ 
    auto y = 0.6, delta=0.1; 
    auto r = to!int(y/delta); 
    assert(r == 6); 
} 

r的值应该是6,但它是5,为什么?

+3

[浮点数学是否被破坏?](http://stackoverflow.com/questions/588004/is-floatingpoint -math-broken)[每个程序员都应该知道的关于浮点运算的知识](http://floating-point-gui.de/) –

+2

之后阅读这篇彻底的文章[每个计算机科学家应该知道什么关于浮点运算](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) –

回答

5

这可能是因为0.6不能纯粹用浮点数表示。你写0.6,但这不完全是你得到的 - 你得到的东西像0.599999999。当你除以0.1时,你得到类似5.99999999的东西,它将转换为5的整数(通过舍入)。其他语言

例子:

C#:Why is (double)0.6f > (double)(6/10f)?

的Java:Can someone please explain me that in java why 0.6 is <0.6f but 0.7is >=0.7f

+1

那我该怎么做呢? – Algo

+2

您可以使用std.math.round将其舍入到最接近的整数:http://dlang.org/library/std/math/round.html。如果你知道你的浮点数结果在你想要的整数的0.5以内,这将把结果舍入到你想要的结果。两个答案的价格! –

+0

或者加0.5。即使用(y/delta + 0.5) – runec

4

计算机代表浮点数二进制。十进制数字0.6和0.1没有精确的二进制表示,而用来表示它们的位数是有限的。因此,会出现截断,其效果在分割过程中出现。该部门的结果不完全是6.00000000,但也许5.99999999,然后截断为5.