选择性地删除小数

时间:2013-10-19 00:40:48

标签: java

我是Java的新手,我正在尝试使我的数字看起来很好,所以我想将双精度转换为整数,但只有当double是3.0之类的东西时,实际上并没有丢失任何小数。如何检查双精度数中是否有小数?

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

抱歉,我无法发布代码,但有很多内容,而且可能没有任何意义。

谢谢,哈罗德

3 个答案:

答案 0 :(得分:2)

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

但我认为你会以错误的方式解决这个问题:

  • 如果你打算以某种不寻常的方式美化数字,那么你应该在格式化中做到这一点;即将数字转换为字符串。

    • 可能有FormatterDecimalFormat的味道已经为你做了这件事。 (例如,请参阅@ Cody的答案。)

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

  • 我也会质疑这样的数字美化声音练习。对于数学家(以及理解他们的小学数学课程的任何人),11.0意味着不同的事情。

    • 1表示整数1,或小数点后没有精度数字的数字;即0.51.49999...范围内的数字。

    • 1.0表示不是整数,而是0.951.049999...范围内的数字。

    所以你的“整理”实际上是在抛弃有用的信息。对于那些可能真正了解和关心数字含义的人来说,这是令人反感的。当然,这取决于背景,以及数字的重要性/重要性。


OP然后评论:

  

想想看,在没有.0的情况下显示它们可能会更好,因为我稍后会用它们进行代数计算。

现货!如果您更改数字以使它们提供漂亮的输出,则会影响其准确性。这将会影响使用这些数字的后续计算的准确性。

答案 1 :(得分:1)

您可以指定合理的错误金额并进行比较:

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

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

答案 2 :(得分:1)

如果您只想格式化输出数字,则应查看PrintStream#printf。以下是number formatting

的概述
System.out.printf("%.0f", "42.0357");
System.out.printf("%.3f", "42.0357");
System.out.printf("%5.0f", "42.0357");

这将打印出来

42
42.036
   42

这些说明符可以让你对间距,对齐,小数等进行大量控制。试一试。