如何检查一个double值是否有小数部分
我有一个双重价值,我必须在我的用户界面显示。 现在条件是double = 0的十进制值例如。 – 14.0在这种情况下,我只能在我的用户界面上显示14。 此外,字符的最大限制是5。
例如 – 12.34,整数值不能大于2位数,因此是我们double的十进制值。
什么可能是这样做的最好方法?
你可以简单地做到这一点: d % 1 == 0
看看是否有一些double d
是整体。
double d = 14.4; if((d-(int)d)!=0) System.out.println("decimal value is there"); else System.out.println("decimal value is not there");
所有的整数都是1的模。所以下面的检查必须给你答案。
if(d % 1 == 0)
ceil和floor都应该给出同样的结果
Math.ceil(xy) == Math.floor(xy)
或者干脆用double值检查是否相等
xy == Math.ceil(xy) xy == Math.floor(xy)
要么
Math.round(xy) == xy
比较两个值:正常的双倍值和双倍值。 如果它们是相同的值,则不存在小数部分。
根据需要使用数字格式化程序格式化该值。 请检查这个 。
您可能希望在比较之前舍入double到5位小数,因为如果您已经对它进行了一些计算,则double可以包含非常小的小数部分。
double d = 10.0; d /= 3.0; // d should be something like 3.3333333333333333333333... d *= 3.0; // d is probably something like 9.9999999999999999999999... // d should be 10.0 again but it is not, so you have to use rounding before comparing d = myRound(d, 5); // d is something like 10.00000 if (fmod(d, 1.0) == 0) // No decimals else // Decimals
如果您使用C ++,我不认为有一个循环函数,所以你必须自己实现它,如: http : //www.cplusplus.com/forum/general/4011/
有趣的小问题。 这有点棘手,因为实数并不总是表示确切的整数,即使它们是有意义的,所以允许宽容是很重要的。
例如容忍度可能是1E-6,在unit testing中,我保留了一个相当粗略的容忍,以便有更短的数字。
我现在可以阅读的答案都不是这样的,所以这是我的解决scheme:
public boolean isInteger(double n, double tolerance) { double absN = Math.abs(n); return Math.abs(absN - Math.round(absN)) <= tolerance; }
和unit testing,以确保它的工作:
@Test public void checkIsInteger() { final double TOLERANCE = 1E-2; assertThat(solver.isInteger(1, TOLERANCE), is(true)); assertThat(solver.isInteger(0.999, TOLERANCE), is(true)); assertThat(solver.isInteger(0.9, TOLERANCE), is(false)); assertThat(solver.isInteger(1.001, TOLERANCE), is(true)); assertThat(solver.isInteger(1.1, TOLERANCE), is(false)); assertThat(solver.isInteger(-1, TOLERANCE), is(true)); assertThat(solver.isInteger(-0.999, TOLERANCE), is(true)); assertThat(solver.isInteger(-0.9, TOLERANCE), is(false)); assertThat(solver.isInteger(-1.001, TOLERANCE), is(true)); assertThat(solver.isInteger(-1.1, TOLERANCE), is(false)); }