使用此双精度值四舍五入到特定位数失败

Rob*_*cks 1 c# math rounding

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

价值 :

double value = 0.61740451388888251;
Run Code Online (Sandbox Code Playgroud)

方法1:

return Math.Round(value, digits);
Run Code Online (Sandbox Code Playgroud)

方法2:

double multiplier = Math.Pow(10, decimals)
return Math.Round(value * multiplier) / multiplier;
Run Code Online (Sandbox Code Playgroud)

即使在VS监视窗口中也失败!

回合

Pio*_*ski 5

Double是浮点二进制点类型。它们用二进制系统表示(如11010.00110)。当十进制表示双精度数时,这只是一个近似值,因为并非所有二进制数字都以十进制表示精确。例如,尝试以下操作:

double d = 3.65d + 0.05d;
Run Code Online (Sandbox Code Playgroud)

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

同样的情况发生在您的情况下。您的变量包含最接近的变量double

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

这是关于float/ 的文章decimalhttp : //csharpindepth.com/Articles/General/FloatingPoint.aspx