编辑3:实际答案。
两个错误的假设导致了这个问题的出现:
a) 浮点数的隐式转换是加倍,而不是浮点数。这解释了两种操作之间的区别。
b) 不要相信调试器。正如 Servy 所指出的那样(在用棍子戳了一下之后),调试器使用 ToString() ,正如他所说的那样,它显然做了隐式舍入。无法以二进制精确表示的浮点值将四舍五入显示。有人可能会争论这一点,我会说这是邪恶的。
Edit2:接受欺骗:在 C# 中将浮点数转换为 int 时的奇怪行为
谢谢诺洛纳尔。你们其他人应该在发布之前阅读实际问题。
编辑:这并不是真正的重复,实际上对所谓重复的答案只是指出了我为什么感到困惑......我想我应该让自己更清楚......
问题是,
a) 为什么 (61.1 * 10) 产生与 (61.1f * 10) 不同的结果[假设编译器优化在这里起作用]?
b) 为什么下面示例中的第二行在调试器输出中显示为“621.0”,在打印时等等 - 当转换为 int 后,它实际上更接近 620.9~?[假设 VS 调试器的“watch”功能在这里起到了格式化的作用]
好的,所以这种情况不再经常发生在我身上,但是我从根本上对看似简单的事情感到困惑(这就是我的问题,假设浮动和强制转换是一件简单的事情......)
我的意思是,我知道花车是如何工作的。但这与精度限制相去甚远,并且可能是非关键操作?
我可以猜测编译器优化与标题中产生不同结果的两种情况有关,但真正的情况是在运行时:
float x = 62.1
x*10 // == 621.0
(int)(x*10) // == 620
我是否正确假设如图所示的 621.0 真的很像 620.999999999999999999999999999999998 并因此在演员表后被截断?
在这种情况下,我想我应该归咎于 VS“手表”功能..