如何防止高价值的双重转换?

时间:2017-07-03 10:32:23

标签: c# double number-formatting globalization tryparse

我有一个函数可以检查string是否为double,如果是,则必须将值四舍五入为两位数并返回string。如果不是,则会返回empty string。这适用于大多数情况。但对于上边框,该值将四舍五入为下一个错误的整数。如何强制该值不会被舍入?

上边框:9999999999999999.9900000000000000

预期价值:9999999999999999.99

给定值:10000000000000000

public string MyConvertFunction(string param)
{ 
    double result;

    if(System.Double.TryParse(param, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.GetCultureInfo("en-US"), out result)) {
        if(result == 0.0) return "";
        return result.ToString("0.00", System.Globalization.CultureInfo.GetCultureInfo("en-US"));
    }

    return "";
}

似乎四舍五入为TryParse部分。因此这样的事情

double x = Math.Truncate(myDoubleValue * 100) / 100;

不可能。

3 个答案:

答案 0 :(得分:2)

double可以保存大约15到16位有效数字,而且你的巨大数字大于数字,所以这就是你的价值四舍五入的原因。所以,你的问题没有解决方案。您有两种选择:

  1. 实际上你不能在不损失精确度的情况下代表如此庞大的数字。当你不断在数字的左端添加数字时,数字右端的一些数字将不再有意义。

  2. 停止使用double并开始使用decimal。此数据类型的性能低于double,但它具有更高的精度。

  3. 十进制参考:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/decimal

答案 1 :(得分:0)

只需检查小数点前的字符数。在您的情况下,最大数量将是16(如果我计算正确:):。

答案 2 :(得分:0)

它与TryParse本身的任何舍入无关。此问题是由System.Double表示数字的方式及其限制所致。

尝试单步执行以下代码:

public static class Program
{
    public static void Main(string[] args)
    {
        var d = 9999999999999999.99;
    }
} 

并检查d的值。它有什么价值?

double根本没有足够的精确度来表示该数字,并且四舍五入为1e+16

如果9999999999999999.99在您的应用中是合理的值,请考虑使用decimal代替double