在Java中如何判断一个双精度数字是否以.0结尾

在Java中如何判断一个双精度数字是否以.0结尾,java,Java,我有一些双倍数字,比如:3.03.14.05.2,等等 我能判断数字是否以.0结尾,比如3.0和4.0吗 有没有最好的办法 PS:我将它们转换为字符串类型,但我认为这不是最好的方法 double i = 3.0; String d = i + ""; return d.endsWith(".0"); 可以这样做: double d = 3.0; System.out.println("Ends with a '.0': " + ((d * 10) % 10 == 0))

我有一些双倍数字,比如:3.03.14.05.2,等等

我能判断数字是否以.0结尾,比如3.0和4.0吗

有没有最好的办法

PS:我将它们转换为字符串类型,但我认为这不是最好的方法

    double i = 3.0;
    String d = i + "";
    return d.endsWith(".0");

可以这样做:

double d = 3.0;
System.out.println("Ends with a '.0': " + ((d * 10) % 10 == 0));
double d = 2.9999999999999999;
如果您这样设置值:

double d = 3.0;
System.out.println("Ends with a '.0': " + ((d * 10) % 10 == 0));
double d = 2.9999999999999999;
在这一行上设置一个断点,跨过并查找d的值。您将认识到该值已经是3.0。 因此,之后的任何转换都将使用值3.0。
这就是为什么使用双变量无法避免这个问题。

您可以这样做

double d = 10.09;
System.out.println(d == Math.floor(d));
// True if it ends with 0, else false

// If you want to return the boolean result
return d == Math.floor(d);

注意:它将一直工作到值为双d=10.00000000000000 1;为止;。小数点中的另一个0最终将给出错误的结果,这要感谢。

我不完全确定,但这可能会由于双精度问题而失效。如果d=10.0,那么实际的二进制表示将接近但不完全是10。如果表示实际上刚好低于10,那么地板操作可能会将其下拉到9并失败。对于负数,它也可能会失败。@TimB-你能给出一个可能失败的例子吗。如果需要的话,我很乐意在此基础上进一步完善并修正答案!:据我所知,浮点精度可以下降也可以上升。这意味着,例如,如果您输入10.0,您实际上可能会得到9.99999999999999999999999764个随机数。这意味着Math.floor10.0将返回9.0,除非Math.floor中有特殊的逻辑来检测这些情况。我不确定它是否会,尽管它可能会。@TimB-当我尝试将其用于double d=10.0d;,时;,它工作得很好,结果是真实的。所以我想,Math.floor在大多数情况下都很好,但可能有一些非常罕见的边缘情况,我不知道。到目前为止,正如所说的10.0是一个随机选取的数字,我实际上不知道哪些数字向下错误,哪些向上错误,也没有时间编写程序来发现谷歌没有给我一个列表。最安全的测试是在-1000到+1000之间的每个整数的for循环上运行它,看看它们是否都有效。我认为这是一个更好的解决方案,因为它消除了双精度问题,并通过适当更改*10来支持任何小数位数。老实说。。。这也不会消除双重精度。。。行为完全相同…是的,您可能需要在执行%10之前强制转换为整数-整数转换将适当地舍入双精度。将双精度值转换为整数值也不能解决问题。你真的不能用一种合适的方式摆脱它。即使是做一些类似双值的事情,也会有0个,你会得到3个99,99,99,99,99,999,所以你会考虑3.0001以0或1结束吗?十进制数以某处结尾的概念是固有的problematic@GyroGearless有道理。我不认为farNay,这就是OP用稍微不同的语法所做的!d、 toString?不编译