我们输入的数值是569.261,实际保存的却是569.260986。因为float只有4个字节表示,精度更低。我们在数值处理的时候,步骤要尽可能简单,越是复杂,问题越多;尽量使用double类型,少用float;对于精度有特殊要求的要注意想其他办法解决。
当我们运行一下代码 double s = 0.18 * 10;Console.WriteLine( s.ToString());double p= 4 / 2.0;Console.WriteLine( p); 会的到 如下结果 0.18 * 10 不等于18 这就是精度丢失 精度丢失的原因 系统是基于二进制的 double 64位 双精度 有效数字为53位 而 double--0.18 转为二进制 位数多余53 则多出...
比如用户输入12.345,则money为12.345,按照预期,centFloor为1234,而cent为1234.5,centFloor<cent,用户也确实输入了多于小数。 想法很美好,可是现实很残忍,问题就出在了代码中使用double进行计算,double作为双精度浮点数,本来就是由若干位的底数和指数的形式表示的,它本来就是不精确的,用它计算得到的结果也更是不精确的。
如2.2,而double类型的数 据也存在同样的问题,所以在浮点数表示中会产生些许的误差,在单精度转换为双精度的时候,也会存在误差的问题,对于能够用二进制表示的十进制数据,如 2.25,这个误差就会不存在,所以会出现上面比较奇怪的输出结果。
这让我想到了可能是因为浮点数采用IEEE754的表示方法,在运算中b会转换成double,可能是在转换中算法的问题导致精度丢失,为了证实该问题,我做了下面的实验: view source print? 01namespaceFloatTest 02 03classProgram 04 05staticvoidMain(string[] args) ...
首先,需要确认程序中是否正确地使用了double类型。如果某个变量被错误地声明为int类型,而实际输入的数据超出了int类型的范围,编译器可能会自动将其转换为double类型,但这种转换可能导致数值精度的丢失,甚至产生错误的结果。其次,这种数值也可能源于浮点数运算的特性。浮点数在计算机中的存储方式决定了它们...
浮点数精度问题:C语言中的浮点数类型(如float和double)是基于IEEE 754标准实现的,但由于浮点数的表示方式是有限的,所以在进行乘除运算时可能会出现精度问题。例如,对于两个无限不循环小数的除法运算,得到的结果可能是一个近似值,而不是准确的结果。 除数为0:在C语言中,对一个数进行除以0的操作是非法的,这是因为...
4E38到+3.4E38,其中阶码7位,符号位1位,尾数24位。但在运行较大数值运算的时候,将有可能产生溢出,得到错误的结果;也有可能有效数字位数超过7位的时候,将会四舍五入,会丢失较多精度。考虑到上述情况,可以定义double float(双精度浮点型),采用8字节64位存储空间,可以表示更大的数字 ...