为什么这个断言失败?为什么不能!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,为什么?
为什么这个断言失败?为什么不能!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,为什么?
这可能是因为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
计算机代表浮点数二进制。十进制数字0.6和0.1没有精确的二进制表示,而用来表示它们的位数是有限的。因此,会出现截断,其效果在分割过程中出现。该部门的结果不完全是6.00000000,但也许5.99999999,然后截断为5.
[浮点数学是否被破坏?](http://stackoverflow.com/questions/588004/is-floatingpoint -math-broken)[每个程序员都应该知道的关于浮点运算的知识](http://floating-point-gui.de/) –
之后阅读这篇彻底的文章[每个计算机科学家应该知道什么关于浮点运算](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) –