Float/Double 似乎不起作用。结果一直是整数

Float/Double doesn't seem to be working. The result keeps coming out to be an integer

import java.util.Scanner;

public class Test {
    
    public static void main(String[] args) {
        
        Scanner userInput = new Scanner(System.in);
        
        final double PI = Math.PI;
        final double sphereVolumeConstant = (4/3);
        
        System.out.println("Volume of a sphere.");
        
        System.out.print("Radius of sphere: ");
        double radius = userInput.nextDouble();
        
        double volumeOfSphere = sphereVolumeConstant * PI * Math.pow(radius, 3);
        
        System.out.println("Volume = " + sphereVolumeConstant);
    }

}

航站楼:

Volume of a sphere.
Radius of sphere: 5
Volume = 1.0

我正在尝试计算常量本身,它一直是一个整数,尽管它不应该,或者至少我认为它不应该。有人可以 help/explain 吗?

sphereVolumeConstant 将永远是 1.0。在变量前写 double 不会使对它的每个操作加倍。如果你想让 sphereVolumeConstant 等于 1.(3) 你必须写:

final double sphereVolumeConstant = (4.0/3);

或:

final double sphereVolumeConstant = ((double) 4 / 3);

因为4.0(double) 4是双精度的,所以现在运算将以双精度进行。

因为 sphereVolumeConstant 的值被指定为 (4/3),根据整数除法的工作原理,它的值将始终是 1.0。您需要做的是至少将 43 转换为 double/float:

  1. final double sphereVolumeConstant = ((double)4/3);
  2. final double sphereVolumeConstant = (4/(double)3);
  3. final double sphereVolumeConstant = (4.0/3);
  4. final double sphereVolumeConstant = (4/3.0);

解释了为什么整数除法会这样。

股息和除数的默认值为 int

在您的示例 ( 4 / 3 ) 中,4 和 3(您的股息和除数)都默认为整数。因此,您将一个整数除以另一个。你得到一个结果整数作为你的商。

System.out.println( 4 / 3 ) ;

1

然后将生成的整数转换为 double1.0.

double a = ( 4 / 3 ) 

1.0

如果你的意思是 43 是浮点数,那就这么说吧。用 d 表示 doublef 表示浮点数。

( 4d / 3d ) 

1.3333333333333333

或使用decimal separator.

( 4.0 / 3.0 )

1.3333333333333333

BigDecimal

如果您关心准确性而不是执行速度,请使用 BigDecimal。切勿将 float/Floatdouble/Double 用于金钱或其他要求准确的事情。

传递包含精度(总位数)和RoundingModeMathContext

MathContext mc = new MathContext( 7 , RoundingMode.HALF_EVEN ) ;  // Banker's rounding.
BigDecimal d = new BigDecimal( "4" ).divide( new BigDecimal( "3" ) , mc ) ;

1.333333

或者,传递小数位数(小数点右侧的位数)和 RoundingMode

BigDecimal e = new BigDecimal( "4" ).divide( new BigDecimal( "3" ) , 2 , RoundingMode.HALF_EVEN ) ;

1.33

示例代码

查看所有内容 code run live at IdeOne.com