在数组中划分2个双精度元素会导致意外舍入

时间:2018-09-09 00:51:40

标签: java

我有一个双重数组,第一个数组中包含某些城市的人口,第二个数组中包含这些城市的国家人口。

double[][] population = new double[][]{ 
        {24153000,18590000,18000000,14657000,14543000,13617000,13197596,12877000,12784000,12400000,12038000,
        11908000,11548000,11035000,10608000,10355000,10290000,10152000,10125000,9752000},

        {1384688986,1384688986,207862518,81257239,162951560,126168156,143964513,105920222,
        1384688986,1296834042,207652865,1384688986,1384688986,1296834042,1384688986,207862518,50791919,1384688986,86300000,31773839
        }

我试图找到居住在城市中的某个国家/地区的人口百分比。因此,我有一个for循环,该循环将某个索引处的数组1除以数组2中的等效索引。循环体显示

double percent= (population[0][i]*100f)/population[1][i];

但是我一直在得到整数除法。例如,为了划分两个数组的第一个元素,我得到2而不是1.744。

有人可以告诉我为什么会这样吗?即使我除以双精度数而不是整数,也只能得到整数。

编辑:这是循环的其余部分。还有一些额外的东西,例如我只应该打印出人口超过1000万的城市。还有些格式。

for (int i = 0; i < population[1].length; i++) {
            if (population[0][i] > 10000000) {
          double percent = (population[0][i]*100f)/population[1][i];
                System.out.printf("%10.0f", percent);
                System.out.println();
            }

2 个答案:

答案 0 :(得分:1)

这是您打印出来的方式。试试

System.out.println(percent); 

或查看格式化程序的文档

https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html

答案 1 :(得分:1)

问题是您打印号码的方式:

   System.out.printf("%10.0f", percent);

格式说明符"%10.0f"说:

  • 十进制浮点数
  • 10个字符的宽度
  • 小数点后
  • 零位数字。

这将四舍五入到最接近的整数。

替代品:

  • 以格式增加零
  • 删除它,并使用默认值(小数点后最多6位数字)
  • 只需使用println(percent) ...,它将以最高的精确度显示数字...而已。

注意:在强制表达式使用浮点计算时,建议使用100.0(类型double)而不是100f(类型float)。最好以double的精度进行计算,尤其是要将结果分配给double时。

在这种情况下,由于population已经是浮点,因此您没有强制使用浮点。但是:

  • 最好使用100.0来向读者表明,计算是以双精度进行的。

  • float文字可能不如相应的double文字那么精确...尽管在这种情况下不是这样。