我是Java的新手,我正在尝试使我的数字看起来很好,所以我想将双精度转换为整数,但只有当double是3.0之类的东西时,实际上并没有丢失任何小数。如何检查双精度数中是否有小数?
我的程序包含大量代码,但我所拥有的是一个循环,它将一系列值分配给数组的索引,然后我想按顺序打印每个值,如果可以,则丢失小数。
抱歉,我无法发布代码,但有很多内容,而且可能没有任何意义。
谢谢,哈罗德
答案 0 :(得分:2)
测试一个浮点数是否“接近”一个整数...对于某个close的定义很简单;请参阅@ hexafraction的答案。
但我认为你会以错误的方式解决这个问题:
如果你打算以某种不寻常的方式美化数字,那么你应该在格式化中做到这一点;即将数字转换为字符串。
可能有Formatter
或DecimalFormat
的味道已经为你做了这件事。 (例如,请参阅@ Cody的答案。)
否则,您可以创建一个简单的DecimalFormat
子类来重写输出字符串,以删除冗余(以您的思维方式!)尾随零等。
我也会质疑这样的数字美化声音练习。对于数学家(以及理解他们的小学数学课程的任何人),1
和1.0
意味着不同的事情。
1
表示整数1,或小数点后没有精度数字的数字;即0.5
至1.49999...
范围内的数字。
1.0
表示不是整数,而是0.95
到1.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
这些说明符可以让你对间距,对齐,小数等进行大量控制。试一试。