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-:=