double 和 float 的区别是double精度高,有效数字16位,float精度7位。你看下面的运行结果,double型的g输出得结果,小数位7后的8也没了,因为超出了double型的有效位数。同理float型的f输出后7后面的数字超出了精度范围,没有任何意义了。
float 只有6个小数位是有意义的,再后面的无意义,可能是任何东西。小数的表示法是 IEEE754 这种规则中确立的,对于像 1/3 这种无限小数,或无法被2整除的东西转换成2进制时都会可能有些不精确的地方,这个直接使用原始的办法是无法避免的,需要专门的针对数学运算的其它 API 来解决。
不过不清楚怎么不直接显示出来而要转换成 E 的表示法(这样平白弄出个小数位的问题来)。
在 Java 中如果你打算处理数字的运算,应该用 java.math.BigDecimal,不要直接使用基本数据类型。