使用此双精度值舍入到特定数字失败

时间:2014-12-05 19:43:00

标签: c# math rounding

我试图在C#中截断一系列双精度值。无论我使用什么舍入方法,以下值都会失败。这个值导致这两种方法失败的问题是什么?为什么偶数Math.Round无法正确截断数字?可以使用什么方法来正确截断这些值?

值:

double value = 0.61740451388888251;

方法1:

return Math.Round(value, digits);

方法2:

double multiplier = Math.Pow(10, decimals)
return Math.Round(value * multiplier) / multiplier;

即使在VS观看窗口中也会失败!

round

4 个答案:

答案 0 :(得分:5)

Double是浮点二进制点类型。它们以二进制系统表示(如11010.00110)。当十进制系统中出现double时,它只是一个近似值,因为并非所有二进制数都在十进制系统中具有精确表示。试试这个例子:

double d = 3.65d + 0.05d;

它不会导致3.7但会导致3.6999999999999997。这是因为变量包含最接近的可用double

在你的情况下也是如此。您的变量包含最接近的可用double

对于精确操作,double / float不是最幸运的选择。 当您需要快速演奏或想要在更大范围的数字上操作时,请使用double / float,但不需要高精度。例如,它是物理学计算的完美类型。 对于精确的十进制运算,请使用decimal

以下是关于float / decimalhttp://csharpindepth.com/Articles/General/FloatingPoint.aspx

的文章

答案 1 :(得分:3)

根据这个给出双精度二进制表示的在线工具,最接近0.62的两个双精度值是:

6.19999999999999995559107901499E-10x3FE3D70A3D70A3D7 link

6.20000000000000106581410364015E-10x3FE3D70A3D70A3D8 link

我不确定为什么这些都不完全符合你的价值,但就像其他人所说的那样,这可能是一个浮点表示问题。

答案 2 :(得分:3)

如果您需要更精确的数字表示,您可能需要使用decimal类型,该类型具有更高的精度但范围更小(通常用于财务计算)。

有关何时在此处使用每个内容的详细信息:https://stackoverflow.com/a/618596/1373170

答案 3 :(得分:-1)

我认为你正在遇到双精度浮点数(64位)的二进制限制。从http://en.wikipedia.org/wiki/Double-precision_floating-point_format开始,双倍只给出15-17位有效数字。