将 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。我调查了一下,似乎从 double
到 nfloat
的转换失败了。
如何截断我的 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
我有一个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。我调查了一下,似乎从 double
到 nfloat
的转换失败了。
如何截断我的 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