2017-08-29 76 views
-1

为什么: Console.WriteLine(Math.Floor(128.766*1000));为什么我需要做的浮点运算与Math.floor

产生不同的结果:

Console.WriteLine(Math.Floor((decimal)128.766*1000));

当然,正确答案是128766是否有工作int或小数。 (我熟悉铸造到除法例如小数。)

我使用.NET 4.5 C#

+0

http://csharpindepth.com/Articles/General/FloatingPoint.aspx。读这个。一个Маth.Floor返回十进制其他的double,这就是为什么。 – mybirthname

+1

运行以下提示:['Console.WriteLine((128.766 * 100).ToString(“e20”))'](https://ideone.com/s01m87) – dasblinkenlight

回答

4

第一行使用浮点数学,这是不准确的。 128.766*1000可能评估为128765.99999999999或类似的东西。

Math.Floor将其下降为128765

但是,在第二行中,首先将结果转换为decimal,然后再将Math.Floor转换为decimal。由于decimal是128位并且具有较小的范围,所以转换为十进制可以消除这种不准确性。有关更多信息,请参见here。当您将128765.9999999999转换为decimal时,它变成了128766

+3

'decimal'本身一个浮点类型,并且一般肯定具有与所有浮点类型相同的不准确性问题。这只是OP的值可以精确表示。 – hvd

+0

@ hvd是的,我意识到这一点,并编辑。 – Sweeper