我是 Java 新手,我想让我的数字看起来不错,所以我想将双精度数转换为整数,但前提是双精度数类似于 3.0,实际上不会丢失任何小数。如何检查双精度中是否有小数?
我的程序包含大量代码,但我拥有的是一个循环,它将一系列值分配给数组的索引,然后我想按顺序打印每个值,如果可以的话,会丢失小数点。
抱歉,我不能发布代码,但是有很多,一小段代码可能没有意义。
谢谢,哈罗德
我是 Java 新手,我想让我的数字看起来不错,所以我想将双精度数转换为整数,但前提是双精度数类似于 3.0,实际上不会丢失任何小数。如何检查双精度中是否有小数?
我的程序包含大量代码,但我拥有的是一个循环,它将一系列值分配给数组的索引,然后我想按顺序打印每个值,如果可以的话,会丢失小数点。
抱歉,我不能发布代码,但是有很多,一小段代码可能没有意义。
谢谢,哈罗德
测试浮点数是否“接近”整数很简单......对于接近的一些定义;请参阅@hexafraction 的答案。
但我认为你以错误的方式处理这个问题:
如果您要以某种不寻常的方式美化数字,那么您应该在格式中进行;即数字到字符串的转换。
可能已经有一种味道Formatter
或DecimalFormat
已经为你做这件事了。(例如,参见@Cody 的回答。)
否则,您可以创建一个简单的子类DecimalFormat
,重写输出字符串以删除多余的(以您的思维方式!)尾随零等。
我也会质疑这样美化数字是否合理。对于一个数学家(实际上是任何了解他们小学数学课的人),1
并且1.0
意味着不同的东西。
1
表示整数 1 或小数点后没有精度的数字;即范围0.5
为的数字1.49999...
。
1.0
表示不是整数,而是范围0.95
为的数字1.049999...
。
因此,您的“整理”实际上是在丢弃有用的信息。对于可能真正理解并关心这些数字含义的人来说,这将是令人反感的。当然,这取决于上下文以及数字的重要性/意义。
OP然后评论:
想一想,不带 .0 的情况下只显示它们可能会更好,因为我稍后会用它们进行代数计算。
发现!如果您更改数字以使它们提供漂亮的输出,那么您将损害它们的准确性。这将损害使用这些数字进行后续计算的准确性。
如果您只想格式化输出数字,您应该查看PrintStream#printf。这是数字格式的一个很好的概述
System.out.printf("%.0f", "42.0357");
System.out.printf("%.3f", "42.0357");
System.out.printf("%5.0f", "42.0357");
这将打印出来
42
42.036
42
这些说明符使您可以对间距、对齐方式、小数等进行大量控制。试试看吧。
您可以分配一个合理的错误量并进行比较:
if(Math.abs(someDouble-(StrictMath.round(someDoublet))<0.0001){
long thatLong = StrictMath.round(someDouble);
}
这会将浮点数与舍入的浮点数进行比较,如果它小于 0.0001(或您选择的增量),则转换为 int。