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
。您需要做的是至少将 4
或 3
转换为 double/float:
final double sphereVolumeConstant = ((double)4/3);
final double sphereVolumeConstant = (4/(double)3);
final double sphereVolumeConstant = (4.0/3);
final double sphereVolumeConstant = (4/3.0);
解释了为什么整数除法会这样。
股息和除数的默认值为 int
在您的示例 ( 4 / 3 )
中,4 和 3(您的股息和除数)都默认为整数。因此,您将一个整数除以另一个。你得到一个结果整数作为你的商。
System.out.println( 4 / 3 ) ;
1
然后将生成的整数转换为 double
、1.0
.
double a = ( 4 / 3 )
1.0
如果你的意思是 4
或 3
是浮点数,那就这么说吧。用 d
表示 double
或 f
表示浮点数。
( 4d / 3d )
1.3333333333333333
( 4.0 / 3.0 )
1.3333333333333333
BigDecimal
如果您关心准确性而不是执行速度,请使用 BigDecimal
。切勿将 float
/Float
或 double
/Double
用于金钱或其他要求准确的事情。
传递包含精度(总位数)和RoundingMode
的MathContext
。
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。
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
。您需要做的是至少将 4
或 3
转换为 double/float:
final double sphereVolumeConstant = ((double)4/3);
final double sphereVolumeConstant = (4/(double)3);
final double sphereVolumeConstant = (4.0/3);
final double sphereVolumeConstant = (4/3.0);
股息和除数的默认值为 int
在您的示例 ( 4 / 3 )
中,4 和 3(您的股息和除数)都默认为整数。因此,您将一个整数除以另一个。你得到一个结果整数作为你的商。
System.out.println( 4 / 3 ) ;
1
然后将生成的整数转换为 double
、1.0
.
double a = ( 4 / 3 )
1.0
如果你的意思是 4
或 3
是浮点数,那就这么说吧。用 d
表示 double
或 f
表示浮点数。
( 4d / 3d )
1.3333333333333333
( 4.0 / 3.0 )
1.3333333333333333
BigDecimal
如果您关心准确性而不是执行速度,请使用 BigDecimal
。切勿将 float
/Float
或 double
/Double
用于金钱或其他要求准确的事情。
传递包含精度(总位数)和RoundingMode
的MathContext
。
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。