java - 为什么Double会在小数点后获得额外的数字?
问题描述
我正在运行这段代码
public class Test{
public static void main(String args[]){
double d = Math.log(125)/Math.log(5);
float f = (float)(Math.log(125f)/Math.log(5f));
System.out.printf("DOUBLE: %.20f\n", d);
System.out.printf("FLOAT : %.20f\n", f);
}
}
并看到以下输出
DOUBLE: 3.00000000000000040000
FLOAT : 3.00000000000000000000
125 是 5 3所以 log(125)/log(5) 理想情况下应该给出 3。这个输出来自哪里 3.00000000000000040000 在双倍的情况下?无法理解原因(内部是什么原因造成的)对此的任何了解都会有所帮助。
解决方案
浮点表示(float 和 double)的问题之一是它们不以十进制存储值,而是以二进制形式存储它们。这意味着许多数字近似地,而不是精确地像整数,等于它们的期望值。当您具有更高的精度时,近似值会更好。
在 Java 中, double 使用八字节表示,而 float 使用四字节。因此,在表示任何特定值时,双精度数通常会比浮点数更好(或至少不会更差)。我希望这就是为什么 Java 的设计者选择 double 作为浮点文字的表示的原因。
所以基本上当你在 Java 中说“float”时,实际上是声明了一个 32 位 1-8-23 IEEE 浮点数,类似地,“double”是一个 64 位 1-11-52 IEEE 浮点数。
推荐阅读
- javascript - Node.js 和 HTML
- git - 将 Git 提交映射到版本/标签
- python - 时间序列 Keras LSTM 回显而不是预测
- ios - 在图像中定位 Xrite ColorChecker 样本
- java - NoSuchElementException 错误
- python - 如何从 1d numpy 数组和两个限制数组中获取切片区域的 2d 数组
- python - Python记录重复输出
- c - 如果进程被 SIGKILLed,操作系统(POSIX)是否完成对内存映射文件的修改?
- html - CSS,如何在不影响内联文本的情况下向下或向上移动?
- virtual-machine - 访问qemu套接字时libvirt Apparmor权限被拒绝