转换为String时的值不正确(" G29")

时间:2014-09-09 13:47:51

标签: c# formatting

我有代码在将值呈现给UI之前从值中删除尾随零,但是我发现在某些情况下,它不是删除零而是改变值。

例如:123.400000000000000000变为123.40000000000001

我正在使用的代码是:

string value = "123.400000000000000000";
value = double.Parse(value).ToString("G29");

有谁知道为什么会发生这种情况,以及我如何改变我的代码,以便显示“123.4'代替。

2 个答案:

答案 0 :(得分:1)

这是因为您将其转换为double,因为每个处理浮点值的人都知道,双精度值不是无限精度值。所选择的值尽可能接近您提供的值,但并不总是完全符合您的要求。

如果你有一个数字样式的字符串,你想从中删除尾随的零,为什么不用它来删除尾随的零,如下所示:

if (s.Contains(".")) {
    Regex regex = new Regex("\\.?0*$");
    s = regex.Replace(s,"");
}

检查.字符是为了确保您不会从1000之类的数字中删除尾随零。一旦你知道那里有一个小数点,零(和小数点本身,如果它后面的所有零都是零)可以被剥离到最后而不受惩罚。您可以在以下完整的控制台程序中查看它:

using System;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        static string StripZ(string s)
        {
            if (s.Contains("."))
            {
                Regex regex = new Regex("\\.?0*$");
                s = regex.Replace(s, "");
            }
            return s;
        }

        static void Main(string[] args)
        {
            Console.WriteLine(StripZ("123.400"));
            Console.WriteLine(StripZ("3.0"));
            Console.WriteLine(StripZ("7."));
            Console.WriteLine(StripZ("1000"));
            Console.ReadLine();
        }
    }
}

该程序的输出是:

123.4
3
7
1000

答案 1 :(得分:1)

问题是123.4在二进制浮点数据类型中不能完全表示。 closest double precision value是:

123.40000 00000 00005 68434 18860 80801 48696 89941 40625

ToString方法将其四舍五入到

123.40000 00000 0001

您应该使用十进制数据类型而不是二进制数据类型。例如:

string value = "123.400000000000000000";
value = decimal.Parse(value).ToString("G29");

但是,如果你真的是以一个字符串开头,并且只想修剪尾随的零,那么使用文本处理这样做可能更为谨慎。