如何防止转换高价值的双倍?
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 位有效数字,而您的大数字比这大,所以这就是您的值四舍五入的原因。因此,您的问题没有解决方案。您有两个选择:
接受这样一个事实,即您无法在不损失精度的情况下表示如此大的数字。随着你不断地在数字的左端添加数字,数字右端的一些数字将不再有意义。
停止使用 double
并开始使用 decimal
。这种数据类型的性能比 double
差,但精度更高。
小数参考:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/decimal
我有一个函数可以检查 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 位有效数字,而您的大数字比这大,所以这就是您的值四舍五入的原因。因此,您的问题没有解决方案。您有两个选择:
接受这样一个事实,即您无法在不损失精度的情况下表示如此大的数字。随着你不断地在数字的左端添加数字,数字右端的一些数字将不再有意义。
停止使用
double
并开始使用decimal
。这种数据类型的性能比double
差,但精度更高。
小数参考:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/decimal