使用双打时.NET出现问题

时间:2011-03-08 04:09:30

标签: .net floating-accuracy

在.NET中,当我从1.35072中减去1.35时,显示为.000719999999。使用double时,我怎么能得到.00072?

TOTKILO.Text = KILO.Text * TOUCH.Text * 0.01;    //here 1.35072
TextBox10.Text = TextBox9.Text * TextBox8.Text * 0.01; //here 1.35
K = Val(TOTKILO.Text) - Val(TextBox10.Text);  //here it shows 0.00719999

3 个答案:

答案 0 :(得分:5)

取决于你真正的要求。

如果你想要舍入到五位小数,你可以这样做:

double x = 1.35072;
double y = 1.35;
double z = Math.Round(x - y, 5); // 0.00072

另一方面,如果您的目标是始终通过添加/减去十进制数来获得精确结果,请使用decimal类型而不是double,因为它本身就是一个基数为10的类型(而不是基2型),因此可以精确地表示以十进制形式表示的数字。

decimal x = 1.35072M;
decimal y = 1.35M;
decimal z = x - y; // 0.00072M

答案 1 :(得分:0)

双打和浮点总是以不同于我们想象的精度来表示。始终将值四舍五入到小数位,然后检查答案。

其他详细信息位于 How To Work Around Floating-Point Accuracy/Comparison Problems

答案 2 :(得分:0)

从我所看到的,你几乎从未真正需要double。几乎所有时间decimalSystem.Decimal)都能满足您的需要,而且它是一个确切的数字,而不是浮点表示,因此您永远不会遇到这些舍入问题。