我有一个函数可以检查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;
不可能。
答案 0 :(得分:2)
double
可以保存大约15到16位有效数字,而且你的巨大数字大于数字,所以这就是你的价值四舍五入的原因。所以,你的问题没有解决方案。您有两种选择:
实际上你不能在不损失精确度的情况下代表如此庞大的数字。当你不断在数字的左端添加数字时,数字右端的一些数字将不再有意义。
停止使用double
并开始使用decimal
。此数据类型的性能低于double
,但它具有更高的精度。
十进制参考:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/decimal
答案 1 :(得分:0)
只需检查小数点前的字符数。在您的情况下,最大数量将是16(如果我计算正确:):。
答案 2 :(得分: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
。