Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解Java变量/小数_Java_Variables_Decimal - Fatal编程技术网

理解Java变量/小数

理解Java变量/小数,java,variables,decimal,Java,Variables,Decimal,我正在尝试使用当前系统时间 long now = System.currentTimeMillis(); 了解自1970年以来光的传播距离,单位为km double km = (now / 1000.0) * 299792.458; 并打印值 System.out.printf("Since the unix Epoch, light has traveled...\n%f km", km); 但是当我运行代码时,我只得到了两位小数的答案 435963358497001.750000 km

我正在尝试使用当前系统时间

long now = System.currentTimeMillis();
了解自1970年以来光的传播距离,单位为km

double km = (now / 1000.0) * 299792.458;
并打印值

System.out.printf("Since the unix Epoch, light has traveled...\n%f km", km);
但是当我运行代码时,我只得到了两位小数的答案

435963358497001.750000 km
这有什么原因吗?使用

System.out.println(km);
给我

4.3596335849700175E14

在那里看到E有道理,为什么它会被切断。有什么方法可以将值设置为小数点后3位或更多位吗?

只需将其设置为三位,试试这个

System.out.printf("Since the unix Epoch, light has traveled...\n%.3f km", km);
您超过了15到17位十进制数字的双精度,因此结果是四舍五入的

请尝试改用BigDecimal:


为什么不直接使用km=now*299.792458;而不是km=now/1000.0*299792.458@LưuVĩnhPhúc在文章中使用了你的建议。有助于简化代码。谢谢。这很有帮助,但不能解决我的问题。我得到了三位小数,但最后一位总是0。这会给出更多的小数位数,但由于光速只有9位有效数字,所以结果的前9位才是相关的。@Henry,这9位是精确的:其精确值为299792458米/秒,约为3.00×10⁸ m/s,因为米的长度是根据该常数和国际时间标准定义的。没有舍入,因此使用16位以上的精度进行计算是有效的。是的,你是对的,在这种情况下有效。尽管如此,我还是会留下我的评论作为警告,对于其他物理常数,在结果中给出大量数字可能没有意义。再深入一点,时间值的准确性实际上存在问题,因为UNIX时间戳不考虑闰秒。例如,见。这是一个系统错误,可以纠正。谢谢。有没有其他不使用BigDecimal的方法?它工作得很好,但我相信有一种方法可以不用BigDecimal。
long now = 1454217232166L; // Sun Jan 31 00:13:52 EST 2016
BigDecimal km = BigDecimal.valueOf(now).multiply(BigDecimal.valueOf(299.792458));
System.out.println(km); // prints: 435963358497001.804028