将nfloat截断为两位小数但从不向上舍入

时间:2015-03-06 12:44:54

标签: c# ios math xamarin.ios xamarin

我有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。截断是不可能的?

3 个答案:

答案 0 :(得分:1)

请记住,您不能将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

答案 1 :(得分:0)

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

        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";
        }

答案 2 :(得分:0)

几乎有扩展方法:

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