在逗号后面格式化一到两位数而不向上或向下舍入

时间:2013-08-09 18:45:48

标签: c# formatting decimal rounding

我一直在寻找,我根本找不到答案,没有一个能正常工作。

我想把像0.33333333333这样的双倍变成0,33或0.6666666666变成0,66

如0.9999999999之类的数字应该变为1。

我尝试了各种方法,比如

value.ToString("##.##", System.Globalization.CultureInfo.InvariantCulture)

它只是返回垃圾或错误地舍入数字。 有什么帮助吗?

基本上每个数字除以9,然后需要显示2个小数位而不进行任何舍入。

我找到了一个很好的功能,似乎适用于高达9.999999999的数字 除此之外,它开始丢失一个十进制数。有一个像200.33333333333的数字 它只显示200而不是200,33。对那些家伙有什么修复?

这是:

string Truncate(double value, int precision)
{
    string result = value.ToString();

    int dot = result.IndexOf(',');
    if (dot < 0)
    {
        return result;
    }

    int newLength = dot + precision + 1;

    if (newLength == dot + 1)
    {
        newLength--;
    }

    if (newLength > result.Length)
    {
        newLength = result.Length;
    }

    return result.Substring(0, newLength);
}

5 个答案:

答案 0 :(得分:8)

你试过吗

Math.Round(0.33333333333, 2);

更新*

如果你不希望小数四舍五入你可以做的是将double更改为一个字符串,然后得到一个子串到两个小数位并将其转换回一个double。

doubleString = double.toString();
if(doubleString.IndexOf(',') > -1)
{
   doubleString = doubleString.Substring(0,doubleString.IndexOf(',')+3);
}
double = Convert.ToDouble(doubleString);

您可以使用if语句检查.99并将其更改为1。

答案 1 :(得分:4)

Math.Truncate(value * 100)/100

虽然我不保证分区将如何影响浮点数。十进制数通常不能在浮点中精确表示,因为它们存储为基数2,而不是基数10,因此如果要保证可靠性,请使用decimal,而不是double

答案 2 :(得分:2)

Math.Floor有效地丢弃小数点后的任何内容。如果要保存两位数,请执行毛刺操作 - 乘以然后除以:

Math.Floor(100 * number) / 100

这比在双重转换为字符串中对逗号进行文化相关搜索更快更安全,正如接受的答案所示。

答案 3 :(得分:0)

Math.Round((decimal)number, 2)

首先投射到小数将避免documentation page上讨论的精度问题。

答案 4 :(得分:0)

你可以从下面尝试一下。这有很多方法。

1. 
 value=Math.Round(123.4567, 2, MidpointRounding.AwayFromZero) //"123.46"
2.
 inputvalue=Math.Round(123.4567, 2)  //"123.46"
3. 
 String.Format("{0:0.00}", 123.4567);      // "123.46"
4. 
string.Format("{0:F2}", 123.456789);     //123.46
string.Format("{0:F3}", 123.456789);     //123.457
string.Format("{0:F4}", 123.456789);     //123.4568