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

How to prevent converting of double with high value?

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

不可能。

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

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

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

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

  2. 停止使用 double 并开始使用 decimal。这种数据类型的性能比 double 差,但精度更高。

小数参考:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/decimal