wul*_*pro 9 java variables primitive-types
这里有一些相关的问题.
根据标题,如果我们将变量类型指定为long或float,double,为什么需要它?编译器是否在编译时评估变量类型?
Java认为所有积分文字都是int- 这是为了减少无意中内存浪费的打击?并且所有浮点文字都是double- 以确保最高精度?
Pet*_*rey 16
当你有一个常量时,值之间存在微妙的差异,看起来相同但不是.此外,由于引入了自动装箱,因此您可以获得非常不同的结果.
考虑一下如果将0.1乘以0.1乘以浮点数或双精度数并转换为浮点数.
float a = (float) (0.1 * 0.1);
float b = 0.1f * 0.1f;
System.out.println("a= "+new BigDecimal(a));
System.out.println("b= "+new BigDecimal(b));
System.out.println("a == b is " + (a == b));
Run Code Online (Sandbox Code Playgroud)
版画
a= 0.00999999977648258209228515625
b= 0.010000000707805156707763671875
a == b is false
Run Code Online (Sandbox Code Playgroud)
现在比较您使用float或int获得计算时得到的结果.
float a = 33333333f - 11111111f;
float b = 33333333 - 11111111;
System.out.println("a= "+new BigDecimal(a));
System.out.println("b= "+new BigDecimal(b));
System.out.println("a == b is " + (a == b));
Run Code Online (Sandbox Code Playgroud)
版画
a= 22222220
b= 22222222
a == b is false
Run Code Online (Sandbox Code Playgroud)
比较int和long
long a = 33333333 * 11111111; // overflows
long b = 33333333L * 11111111L;
System.out.println("a= "+new BigDecimal(a));
System.out.println("b= "+new BigDecimal(b));
System.out.println("a == b is " + (a == b));
Run Code Online (Sandbox Code Playgroud)
版画
a= -1846840301
b= 370370362962963
a == b is false
Run Code Online (Sandbox Code Playgroud)
比较double有long
double a = 333333333333333333L / 333333333L;
double b = 333333333333333333D / 333333333D;
System.out.println("a= "+new BigDecimal(a));
System.out.println("b= "+new BigDecimal(b));
System.out.println("a == b is " + (a == b));
Run Code Online (Sandbox Code Playgroud)
版画
a= 1000000001
b= 1000000000.99999988079071044921875
a == b is false
Run Code Online (Sandbox Code Playgroud)
总之其可能构造的情况下使用int,long,double或float与使用另一种类型相比,将产生不同的结果.
当您执行的不仅仅是简单的任务时,这一点变得很重要 如果你采取
float x = 0.1*3.0;
如果计算机以双精度进行乘法,然后转换为单精度,或者如果它首先将数字转换为单精度然后相乘,则会有所不同.
编辑:不是在这个明确的情况下0.1和3.0,但如果你的数字变得足够复杂,你将遇到精度问题,显示浮点数和双精度之间的差异.如果它们应该是双精度或浮点数,则使它对编译器显而易见避免歧义.