如何在c#中舍入浮点值?

Die*_*rdk 6 c# floating-point rounding

我有一个舍入浮点值的问题.我有一个设置为0.8的浮点值,但在c#代码中它是以某种方式0.80000000000000004.

所以我想围绕它,所以它变成0.8.

我试过了:

float roundedFloatvalue = (float)Math.Round((Decimal)floatvalue, 2, MidpointRounding.AwayFromZero);
Run Code Online (Sandbox Code Playgroud)

和:

float roundedFloatvalue = Truncate(floatvalue, 2);

public static float Truncate(float value, int digits)
{
    double mult = Math.Pow(10.0, digits);
    double result = Math.Truncate(mult * value) / mult;
    return (float)result;
}
Run Code Online (Sandbox Code Playgroud)

似乎我不能得到0.80000000000000004为0.8,我不知道为什么上述任何一个都不起作用.

Dav*_*nan 14

您不能将0.8精确表示为二进制浮点值,因为0.8在二进制浮点中无法表示.关于这个主题的必读书是每个计算机科学家应该知道的关于浮点运算的内容.

您可以使用decimal替代,它使用十进制浮点表示数字,并且可以精确地表示0.8.或者您可以选择继续使用二进制浮点,但仅在小数点后显示有限的位数.

要将值转换为decimal变量,舍入到两个小数位,您可以写:

decimal decimalValue = Math.Round((decimal)floatValue, 2);
Run Code Online (Sandbox Code Playgroud)