为什么(int)(61.1f * 10)== 610但是(int)(61.1 * 10)== 611

时间:2013-02-21 15:28:15

标签: c# floating-point precision

编辑3:实际答案。

两个错误的假设导致问题突然出现:

a)浮点数的隐式转换是加倍,而不是浮点数。这解释了两种操作之间的区别。

b)不要相信调试器。正如Servy指出的那样(在用棍子戳了一下之后)调试器使用了ToString(),正如他所说的显然是隐式舍入。没有二进制精确表示的浮点值将显示为四舍五入。有人可能会争论这个,我认为这是邪恶的。

Edit2:接受的欺骗:Strange behavior when casting a float to int in C#

谢谢Nolonar。其他人应该在发布前阅读实际问题。

编辑:这不是真的重复,实际上对所谓的重复的答案只是指出我为什么感到困惑......我想我应该让自己更清楚......

问题是,

a)为什么(61.1 * 10)产生不同的结果(61.1f * 10)[假设编译器优化在这里起作用]?

b)为什么下面例子中的第二行在调试器输出中显示为“621.0”,打印时等等 - 当转换为int后显然更接近620.9~? [假设VS调试器“监视”功能在这里格式化魔法]

好的,所以这种情况不会经常发生在我身上,但我在这里基本上对于看似简单的事情感到困惑(其中存在我的问题,假设花车和演员是一件简单的事......)

我的意思是,我知道花车是如何工作的。但这远远不是精确限制,可能是非关键操作?

我猜测编译器优化与标题中的两种情况有关,产生不同的结果,但实际情况是在运行时:

float x = 62.1
x*10 // == 621.0
(int)(x*10) // == 620

我是否正确假设621.0如图所示真的更像620.99999999999999999999999999999998并因此在演员之后得到截断?

在这种情况下,我想我应该责怪VS“观看”功能..

0 个答案:

没有答案