我有代码在将值呈现给UI之前从值中删除尾随零,但是我发现在某些情况下,它不是删除零而是改变值。
例如:123.400000000000000000变为123.40000000000001
我正在使用的代码是:
string value = "123.400000000000000000";
value = double.Parse(value).ToString("G29");
有谁知道为什么会发生这种情况,以及我如何改变我的代码,以便显示“123.4'代替。
答案 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");
但是,如果你真的是以一个字符串开头,并且只想修剪尾随的零,那么使用文本处理这样做可能更为谨慎。