我正在尝试截断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监视窗口中也失败!
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
/ 的文章decimal
:http : //csharpindepth.com/Articles/General/FloatingPoint.aspx