DoubleC#中15位精度的类型不是吗?我正在测试Brainteasers的代码:doubled1=1.000001;双d2=0.000001;Console.WriteLine((d1-d2)==1.0);结果是“假”。当我改变数据类型时:decimald1=1.000001M;十进制d2=0.000001M;十进制d3=d1-d2;控制台.WriteLine(d3==1);程序写出正确答案:“正确”。这道题只用了浮点数后6位。15位精度呢?这与精度无关——它与表示舍入误差有关。System.Decimal能够表示大的浮点数,并显着降低出现任何舍入错误(如您所看到的错误)的风险。System.Single和System.Double没有此功能,它们会关闭数字并产生类似于您在示例中看到的问题。System.Decimal使用比例因子来保留小数位的位置,允许精确表示给定的浮点数,而System.Single和System.Double只能尽可能接近您的值。有关详细信息,请参见System.Double:请记住,浮点数只能近似于十进制数,并且浮点数的精度决定了该数字近似于十进制数的准确程度。默认情况下,Double值包含15位小数精度,但内部最多保留17位。浮点数的精度有几个后果:一般来说,检查浮点值是否相等的方式是检查接近相等,即检查接近最小值的差异(称为epsilon)该数据类型。例如,如果(Math.Abs??(d1-d2)此测试以查看d1和d2是否由给定的相同位模式表示或采用最低有效位。更正(2015年3月2日添加)经过进一步检查,代码应该更像这样://假设d1和d2不都为零if(Math.Abs??(d1-d2)/Math.Max(Math.Abs??(d1),Math.Abs??(d2))也就是说,取d1和d2的绝对差,除以d1和d2的最大值,与Epsilon比较。参考?http://msdn.microsoft.com/en-us/library/system.double.epsilon.aspxhttp://msdn.microsoft.com/en-us/library/system.double.aspx#PrecisionDecimal类型实现十进制浮点数,而double是二进制浮点数.decimal的优点是它在四舍五入方面表现得像人一样,如果你用十进制值初始化它,那么这个值就会完全按照你指定的方式存储。这只适用于有限长度的十进制数,并且在可表示的范围内和精度。如果你用1.0M/3.0M初始化它,那么它不会像纸上写的0.33333那样精确地存储。如果你用小数初始化二进制FP值,它会从人类可读的十进制形式转换为很少相同的形式二进制表示。decimal类型的主要目的是为了实现金融应用,它在.NET实现中也比double具有更高的精度,但是直接支持硬件BinaryFP,因此比decimalFP操作快得多。请注意,double精确到大约15个有效数字而不是15个小数。d1被初始化为7个有效数字而不是6,而d2只有1个有效数字。它们具有显着不同的幅度这一事实也无济于事。浮点数的思想是它们对于特定的位数并不精确。如果你想要这种功能,你应该看看decimal数据类型。精度不是绝对的,因为十进制数和二进制数之间的转换是不可能精确的。在这种情况下,当以二进制表示时,.1十进制将永远重复。它转换为.000110011001100110011...并永远重复。精度未准确存储。避免比较浮点数。以上是C#学习教程:C#中Double类型的15位精度是多少?如果分享的所有内容对您有用,需要了解更多C#学习教程,希望您多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
