将 nfloat 截断到小数点后两位,但从不四舍五入

Truncate nfloat to two decimal places but never round up

我有一个nfloat。现在我只想保留两位小数,但不应该涉及四舍五入。如果它应该四舍五入,它应该向下舍入。

我试过了

nfloat test = 45.71629f;
Console.WriteLine (test.ToString("F2"));

但他在这里四舍五入(结果:45.72)。它应该是 45.71。我也试过这个扩展方法

// input: 45.71429
public static class MyMathExtension
{
    public static nfloat Truncate(this nfloat value, int digits)
    {
        double mult = Math.Pow(10.0, digits);
        double result = Math.Truncate( mult * value ) / mult;
        return (nfloat) result;
    }
}

输出为 45.71429。我调查了一下,似乎从 doublenfloat 的转换失败了。

如何截断我的 nfloat

编辑:

相同的扩展方法对 float 工作正常!将 float 转换为 nfloat 得到 45.7142906188965。所以截断是不可能的?

所有标准字符串格式化程序和截断函数都进行舍入。你必须把它串起来并切断末端

        double x = 333345.71429f;
        string s = x.ToString(CultureInfo.InvariantCulture);
        string y = s;
        if (s.Contains("."))
        {
            y = s.Substring(0, s.IndexOf(".")) + s.Substring(s.IndexOf("."), Math.Min(3, s.Length - s.IndexOf(".")));
        }
        else
        {
            y = s + ".00";
        }

扩展方法差不多了:

float a = 45.71629f;
var b = Math.Truncate(a*100);
Console.Write(b / 100);

请记住,您不能将 45.71 准确存储为 nfloat(既不是浮点数也不是双精度数),因此您可以截断到尽可能接近 45.71 浮点变量允许的范围,然后使用标准格式化函数,它会四舍五入到小数点后两位,从而显示正确的结果:

nfloat a = 45.71629f;
var b = Math.Truncate (a*100);
var c = b / 100;
Console.WriteLine (c.ToString ("F2"));

将打印

45.71