Java中的类型转换:
Java8大基本数据类型 1,四种整数类型(byte、short、int、long): byte:8 位,用于表示最小数据单位,如文件中数据,-128~127 short:16 位,很少用,-32768 ~ 32767 int:32 位、最常用,-2^31-1~2^31 (21 亿) 2,两种浮点数类型(float、double): float:32 位,后缀 F 或 f,1 位符号位,8 位指数,23 位有效尾数。 double:64 位,最常用,后缀 D 或 d,1 位符号位,11 位指数,52 位有效尾。 3,一种字符类型(char): char:16 位,是整数类型,用单引号括起来的 1 个字符(可以是一个中文字符),使用 Unicode 码代表字符,0~2^16-1(65535)。
字节数少的到字节输多的转化不会造成精度损失
TestDouble.java的输出结果为:
这样的结果是由于浮点数计算有缺陷而造成,
我们知道计算机进行的是二进制运算,我们输入的十进制数字会先转换成二进制,进行运算后再转换为十进制输出。
而N进制可以理解为:数值×基数的幂,例如我们熟悉的十进制数123.4 = 1×102+2×101+3×100+4×10(-1);其它进制的也是同理,例如二进制数11.01 = 1×21+1×20+0+1×2(-2) = 十进制的3.25。
Double类型的数值占用64bit,即64个二进制数,除去最高位表示正负符号的位,在最低位上一定会与实际数据存在误差(除非实际数据恰好是2的n次方)。
。但可以采用引用bigdecimal类来避免这样的精度损失!
package java20190918; import java.math.BigDecimal; public class TestDouble { private static final int DEF_DIV_SCALE = 10; public static double add(double v1,double v2){ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.add(b2).doubleValue(); } public static double sub(double v1,double v2){ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.subtract(b2).doubleValue(); } public static double mul(double v1,double v2){ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.multiply(b2).doubleValue(); } public static double div(double v1,double v2,int scale){ if(scale<0){ throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); } public static void main(String args[]) { System.out.println("0.05+0.01="+add(0.05,0.01)); System.out.println("1.0-0.42="+sub(1.0,0.42)); System.out.println("4.015*100="+mul(4.015,100)); System.out.println("123.3/100="+div(123.3,100,3)); } }
以上是我查阅资料所编写避免丢失精度的方法。
在构建BigDecimal对象时应使用字符串而不是double数值,否则,仍有可能引发计算精度问题的原因是double不能表示为任何有限长度的二进制小数;
字串联接操作:
输出结果为:
100200是因为他们各自输出X、Y的值而造成的。
300=X+Y则是因为双引号位置加错造成的。