【发布时间】:2018-06-01 21:54:31
【问题描述】:
我在乘以双打时遇到了相当奇怪的行为。
制作一个简单的控制台应用程序并尝试以下代码。
private static void Main(string[] args)
{
var b1 = 3.1 * 100D;
var a1 = 4.1 * 100D;
// put breakpoint here and observe b1 and a1 values, to me they are
// b1=310, a1=409.99999999999994
Console.WriteLine(a1);
// notice that Console.WriteLine actually returns 410
}
我怀疑这是二进制中的双重表示,但我无法解释自己怎么可能,你能帮帮我吗?
此外,如果您将 a1 转换为 decimal,它会以某种方式变为 410...
我尝试针对 C# 3.0 和 C#7.0 进行编译都给出了相同的结果。我正在 Visual Studio 2017 中重现此内容。
【问题讨论】:
-
您是在问为什么 4.1*100 不完全是 410,或者为什么 3.1*100 是 310 而不是 309.999999999999994?
-
@NightOwl888 Microsoft says 双打不建议使用往返格式,您应该改用 G17。
-
@i486 谁说我在使用 var 或这种行为时遇到问题,或者无法解决我的计算问题?我问了一个非常具体的问题,你根本没有回答,请坚持这个问题或者不要在帖子中发送垃圾邮件,谢谢。
-
我取消了我的答案,以回答为什么 3.1 * 100 似乎有效的细节。这只是偶然。
-
这取决于您所说的“问题”是什么意思。 OP似乎没有问题,只有一个问题。我的看法是,只要你明白很多小数不能用二进制表示,那就没问题了。
标签: c# .net floating-point floating-accuracy