比如用户输入12.345,则money为12.345,按照预期,centFloor为1234,而cent为1234.5,centFloor<cent,用户也确实输入了多于小数。 想法很美好,可是现实很残忍,问题就出在了代码中使用double进行计算,double作为双精度浮点数,本来就是由若干位的底数和指数的形式表示的,它本来就是不精确的,用它计算得到的结果也更是不精确的。
针对C语言中double的精度问题,可以采用以下解决方法: 4.1. 使用更高精度的数据类型,比如long double。这种方法能够提高浮点数的表示精度,但对于大部分应用来说并不需要如此高的精度。 4.2. 尽量避免浮点数的比较操作,可以通过设定一个误差范围来进行比较。因为浮点数计算结果的精度是有限的,直接比较可能会导致错误的结...
仔细观察后float的第7位后的数字就已经乱了,而double的依然可以输出。 这里的有效数字是值你存放的这个值的每个数,如果123,就是3个有效数字,这里的有效数字包括小数点,所以要求阶乘之和就不能简简单单的用递归然后再加起来就行了,因为阶乘大了之后,有效输出超出范围,则有误差,所以用到了高精度的方法,当时还很懵...
我在GCC上做了同样的实验,结果不管哪种方式得到的结果都是正确的,我只能说可能是double Convert.ToDouble(float)的实现的原因导致的。
虽然大标题是double类型,但为了方便验证,先分析一下float。下图给的是float类型的标准格式。我们主要考虑尾数。 float单精度 IEEE 754 格式 首先假设符号位为1,即正数。指数位为01111111(二进制就是127),IEEE 754规定float类型的偏移是127。因此实际的指数就是127-127=0。此外IEEE 754标准还规定了尾数前面永远有一...
C语言里面,默认%f是小数点后6位,如果想小数点后面16位,写成%.16lf,不会自动四舍五入的,double是一个近似值,通常没有办法做的很精确。通常能精确到小数点后面5,6位,也就是说超过5,6位了可能就不准了。1、double f = 111231.5585; BigDecimal b = new BigDecimal(f); double f1 = ...
我们输入的数值是569.261,实际保存的却是569.260986。因为float只有4个字节表示,精度更低。我们在数值处理的时候,步骤要尽可能简单,越是复杂,问题越多;尽量使用double类型,少用float;对于精度有特殊要求的要注意想其他办法解决。
关于c中 int, float, double转换中存在的精度损失问题 先看一段代码实验: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #include<limits> #include<iostream> usingnamespacestd; intmain() { unsignedinti = numeric_limits<unsignedint>::max();...
不能提高了,每种存储类型都有自己固定的存储空间大小。它就存了这么多,你肯定不能输出更多。如果你想要更多位只能用链表或数组,然后自己写运算的函数。