2017-07-03 81 views
1

我有一个函数,用于检查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; 

不可能。

回答

2

A double可以保存大约15到16位有效数字,并且您的巨大数字大于此值,所以这就是为什么您的值变圆整的原因。所以,你的问题没有解决办法。你有两种选择:

  1. 住在这样的事实,你不能代表如此大的数字而不会损失精度。随着您不断向数字左端添加数字,该数字右端的一些数字将不再有意义。

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

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

+0

使用'decimal'完美的作品。谢谢。 :-) – mburm

+0

很高兴能有所帮助! Ç - := –

0

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

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