【问题标题】:How to prevent converting of double with high value?如何防止转换高价值的double?
【发布时间】:2017-12-06 14:13:25
【问题描述】:

我有一个函数可以检查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;

不可能。

【问题讨论】:

    标签: c# double number-formatting globalization tryparse


    【解决方案1】:

    double 可以容纳大约 15 到 16 位有效数字,而您的巨大数字比这更大,所以这就是您的值被四舍五入的原因。因此,您的问题没有解决方案。你有两个选择:

    1. 接受这样一个事实,即您无法在不损失精度的情况下表示如此大的数字。当你不断在数字的左端添加数字时,数字右端的一些数字将不再有意义。

    2. 停止使用double,改用decimal。这种数据类型的性能比double 差,但它的精度要高得多。

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

    【讨论】:

    • 很高兴能帮上忙! C-:=
    【解决方案2】:

    它与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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-20
        • 1970-01-01
        • 2020-03-27
        相关资源
        最近更新 更多