Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓数字格式有点错误,我得到的不是3.5而是3.49999999,为什么?_Android_Numbers_Format_Rounding - Fatal编程技术网

Android 安卓数字格式有点错误,我得到的不是3.5而是3.49999999,为什么?

Android 安卓数字格式有点错误,我得到的不是3.5而是3.49999999,为什么?,android,numbers,format,rounding,Android,Numbers,Format,Rounding,我将一些数据存储在数据库中,然后用光标读取这些数据。所有数据都是56.45、3.04、0.03类型,因此小数点后有两个数字。现在我想总结一下,但这似乎并不容易。。。我使用c.getDouble(3)获得这些数字,然后将其添加到sum变量中,如下所示: sum+= c.getDouble(4) * multi multi是介于1和100之间的整数。现在我的问题是,在得到sum变量后,我得到一个数字,比如:59.5199999999999。我没有发布代码,但除了一个字符串.valueOf之外,没有

我将一些数据存储在数据库中,然后用光标读取这些数据。所有数据都是56.45、3.04、0.03类型,因此小数点后有两个数字。现在我想总结一下,但这似乎并不容易。。。我使用
c.getDouble(3)
获得这些数字,然后将其添加到sum变量中,如下所示:

sum+= c.getDouble(4) * multi
multi是介于1和100之间的整数。现在我的问题是,在得到sum变量后,我得到一个数字,比如:59.5199999999999。我没有发布代码,但除了一个
字符串.valueOf
之外,没有任何转换,用于使数字显示在我的小部件上。有人经历过吗?据我计算,应该是59.52,但我得到的数字是99999。。。为什么会这样?(有趣的是,
Math.round()
不起作用,即使我设置了(sum)*100/100,我也能得到59.0。)。。
提前感谢!

您的数字对您来说是十进制的,但对计算机来说是二进制的

在十进制和二进制中,有些分数不能精确表示

例如,1/3不能精确地用十进制表示。您只能用类似于0.3333333的值来近似它。但是,如果您尝试使用3*0.3333333333,则结果将是0.99999999,而不是1.0000000000

在二进制中,您有相同的问题,但分数不同

所以,有时当你从十进制转换成二进制再转换回来时(这是计算机为你做浮点运算所必须做的事情),即使所有的数字在十进制中都非常精确,但在精度上也会有很小的误差。当计算机使用二进制近似值时,会引入近似值,从而产生很小的误差


这实际上是编程中一个非常常见的问题。有关更多详细信息,请参阅。

其他方法,您可以将sum变量定义为
double
,然后可以为sum变量设置
NumberFormat

示例:

double sum = 21.2015;
NumberFormat formatter = new DecimalFormat("#.##");
formatter.format(sum);
看看这个网站:我认为这可能会有帮助。我们也有一些解决方案可以尝试,直到我们得到最好的一个。