C# 如何防止高值双精度转换?

C# 如何防止高值双精度转换?,c#,double,number-formatting,globalization,tryparse,C#,Double,Number Formatting,Globalization,Tryparse,我有一个函数,它检查字符串是否为双精度,如果是,则必须将值四舍五入到两位数,并作为字符串返回。如果不是,将返回一个空字符串。这在大多数情况下都很有效。但是对于上边框,值被舍入到下一个整数,这是错误的。我如何强制该值不进行四舍五入 上边框:9999999999999.990000000000000 预期值:99999999999.99 给定值:100000000000000 公共字符串MyConvertFunction(字符串参数) { 双重结果; if(System.Double.TryPar

我有一个函数,它检查
字符串
是否为
双精度
,如果是,则必须将值四舍五入到两位数,并作为
字符串
返回。如果不是,将返回一个
空字符串。这在大多数情况下都很有效。但是对于上边框,值被舍入到下一个整数,这是错误的。我如何强制该值不进行四舍五入

上边框:
9999999999999.990000000000000

预期值:
99999999999.99

给定值:
100000000000000

公共字符串MyConvertFunction(字符串参数)
{ 
双重结果;
if(System.Double.TryParse(param,System.Globalization.NumberStyles.Any,System.Globalization.CultureInfo.GetCultureInfo(“en-US”),输出结果)){
如果(结果==0.0)返回“”;
返回result.ToString(“0.00”,System.Globalization.CultureInfo.GetCultureInfo(“en-US”);
}
返回“”;
}
似乎四舍五入位于
TryParse
部分。所以是这样的

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

不可能。

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

它与
TryParse
本身的任何舍入无关。这个问题是由于
System.Double
表示数字的方式及其局限性造成的

尝试单步执行以下代码:

public static class Program
{
    public static void Main(string[] args)
    {
        var d = 9999999999999999.99;
    }
} 
并检查
d
的值。它有什么价值

double
根本没有足够的精度来表示该数字,它被四舍五入到
1e+16


如果<代码> 9999999999999999 .99 <代码>是你的应用程序中一个合理的值,那么考虑使用<代码>十进制< /代码>而不是<代码>双< /代码>。

a >代码>双可以保存大约15到16个有效数字,并且你的巨大数量大于这个数字,所以这就是为什么你的值变得圆整的原因。所以,你的问题没有解决办法。您有两个选择:

  • 接受这样一个事实:你不能在不损失精确性的情况下代表如此大的数字。当您不断向数字的左端添加数字时,数字右端的某些数字将不再有意义

  • 停止使用
    double
    并开始使用
    decimal
    。这种数据类型的性能比double
  • 差,但精度要高得多


    十进制参考:

    很高兴能提供帮助!C-:=