0

我是 Java 新手,我想让我的数字看起来不错,所以我想将双精度数转换为整数,但前提是双精度数类似于 3.0,实际上不会丢失任何小数。如何检查双精度中是否有小数?

我的程序包含大量代码,但我拥有的是一个循环,它将一系列值分配给数组的索引,然后我想按顺序打印每个值,如果可以的话,会丢失小数点。

抱歉,我不能发布代码,但是有很多,一小段代码可能没有意义。

谢谢,哈罗德

4

3 回答 3

2

测试浮点数是否“接近”整数很简单......对于接近的一些定义;请参阅@hexafraction 的答案。

但我认为你以错误的方式处理这个问题:

  • 如果您要以某种不寻常的方式美化数字,那么您应该在格式中进行;即数字到字符串的转换。

    • 可能已经有一种味道FormatterDecimalFormat已经为你做这件事了。(例如,参见@Cody 的回答。)

    • 否则,您可以创建一个简单的子类DecimalFormat,重写输出字符串以删除多余的(以您的思维方式!)尾随零等。

  • 我也会质疑这样美化数字是否合理。对于一个数学家(实际上是任何了解他们小学数学课的人),1并且1.0意味着不同的东西。

    • 1表示整数 1 或小数点后没有精度的数字;即范围0.5为的数字1.49999...

    • 1.0表示不是整数,而是范围0.95为的数字1.049999...

    因此,您的“整理”实际上是在丢弃有用的信息。对于可能真正理解并关心这些数字含义的人来说,这将是令人反感的。当然,这取决于上下文以及数字的重要性/意义。


OP然后评论:

想一想,不带 .0 的情况下只显示它们可能会更好,因为我稍后会用它们进行代数计算。

发现!如果您更改数字以使它们提供漂亮的输出,那么您将损害它们的准确性。这将损害使用这些数字进行后续计算的准确性。

于 2013-10-19T01:10:01.120 回答
1

如果您只想格式化输出数字,您应该查看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

这些说明符使您可以对间距、对齐方式、小数等进行大量控制。试试看吧。

于 2013-10-19T01:07:19.983 回答
1

您可以分配一个合理的错误量并进行比较:

if(Math.abs(someDouble-(StrictMath.round(someDoublet))<0.0001){
    long thatLong = StrictMath.round(someDouble);
}

这会将浮点数与舍入的浮点数进行比较,如果它小于 0.0001(或您选择的增量),则转换为 int。

于 2013-10-19T00:43:28.843 回答