3

我一直在寻找,我根本找不到答案,它们都不能正常工作。

我想把像 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);
}
4

5 回答 5

8

你有没有尝试过

Math.Round(0.33333333333, 2);

更新*

如果您不希望小数点四舍五入,您可以做的另一件事是将双精度数更改为字符串,然后将子字符串获取到小数点后两位并将其转换回双精度数。

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

您可以使用 if 语句来检查 .99 并将其更改为 1 以适应这种情况。

于 2013-08-09T18:50:14.143 回答
5
Math.Truncate(value * 100)/100

尽管我不保证除法将如何影响浮点数。十进制数通常不能精确地用浮点数表示,因为它们存储为以 2 为底,而不是以 10 为底,所以如果要保证可靠性,请使用 a decimal,而不是 a double

于 2013-08-09T18:48:09.787 回答
3

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

Math.Floor(100 * number) / 100

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

于 2014-02-04T21:00:44.457 回答
2
Math.Round((decimal)number, 2)

首先转换为小数将避免文档页面上讨论的精度问题。

于 2013-08-09T18:50:22.457 回答
1

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

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
于 2015-10-17T07:41:15.330 回答