C# 将nfloat截断到小数点后两位,但不要四舍五入
我有一个C# 将nfloat截断到小数点后两位,但不要四舍五入,c#,ios,math,xamarin.ios,xamarin,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 nfloa
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(或float或double),因此您可以将浮点变量截断为尽可能接近45.71
,然后使用标准格式函数,该函数将四舍五入到小数点后两位,从而显示正确的结果:
nfloat a = 45.71629f;
var b = Math.Truncate (a*100);
var c = b / 100;
Console.WriteLine (c.ToString ("F2"));
将打印
45.71
这是非常危险的。ToString()将根据OP的区域设置返回本地化格式。例如,在我的计算机(意大利语)上,它将返回2,99(逗号而不是句号)。它在
333345.71429f
上失败。索引和长度必须引用字符串中的位置。参数名称:lengthI是指obvs的松散代码,没有本地化,并且假设输入中至少有2个小数位,但该float to字符串为333345。7问题是,当我从float
转换为nfloat
时,我会得到额外的小数位。否则扩展方法就可以了,这不是float或nfloat的问题。我写浮动是出于习惯。不管怎样,这都会起作用,因为您不是截断45.71xxx,而是4571.xxx,然后再次除法。因此,在过程结束时只能有2个十进制数。我不知道为什么,但如果我在控制台上打印扩展方法的返回值,它是45.709990844727。扩展方法本身是正确的。不要使用扩展方法,它是从双精度转换而来的。请使用我的代码。现在我在没有扩展的情况下尝试了方法nfloat itemWidth=(nfloat)Math.Truncate(45.71629f*100)/100;Console.WriteLine(itemWidth)代码>,但系统以某种方式再次将其更改为45.709990844727。它发生在nfloat
cast中。nfloat
可以是float
或double
,具体取决于您的CPU(32位或64位)。但是((float)45.71629f)。ToString(“F2”)
向我返回45.72
(32位),因此它似乎不是一个float/nfloat问题。我如何获得只有有限小数数的nfloat
?也可以是457100000000。ToString
方法引入了舍入,这不是我需要的。在我的代码中,我将结果转换为nfloat
,而不是打印到控制台。但正如你所说的,这并不准确。出于我的目的,我现在使用整数值。如果你想打印,你的解决方案是可行的。