Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将nfloat截断到小数点后两位,但不要四舍五入_C#_Ios_Math_Xamarin.ios_Xamarin - Fatal编程技术网

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
,而不是打印到控制台。但正如你所说的,这并不准确。出于我的目的,我现在使用整数值。如果你想打印,你的解决方案是可行的。