Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,如何检查一个双变量是否有两个以上的小数?_Java_Decimal - Fatal编程技术网

在Java中,如何检查一个双变量是否有两个以上的小数?

在Java中,如何检查一个双变量是否有两个以上的小数?,java,decimal,Java,Decimal,我认为我可以通过以下方式轻松实现这一点: double numInput; numInput = Double.parseDouble(inputTxtField.getText()); if ((numInput * 100) % 1 != 0) { // do something } 然而,我得到了各种奇怪的测试用例,例如: 错误: 2.11, 2.5, 2.6 正确: 2.22,2.3,2.2 我刚开始编程,所以这可能是一个愚蠢的错误,但我认为将一个double乘以100,然后在

我认为我可以通过以下方式轻松实现这一点:

double numInput;

numInput = Double.parseDouble(inputTxtField.getText());

if ((numInput * 100) % 1 != 0) {

// do something

}
然而,我得到了各种奇怪的测试用例,例如:

错误: 2.11, 2.5, 2.6

正确: 2.22,2.3,2.2

我刚开始编程,所以这可能是一个愚蠢的错误,但我认为将一个double乘以100,然后在除以1时检查余数是可行的。其目的是防止有人输入超过两个小数的数字。小于或等于2位小数即可

任何提示都将不胜感激!谢谢大家!

编辑:谢谢你的快速评论!这就解决了我的问题,我真的很感激提供额外的信息,解释为什么它不起作用。谢谢大家!

试试看

if(inputTxtField.getText().indexOf(".") >= 0 && inputTxtField.getText().indexOf(".") < inputTxtField.getText().length() - 2){
if(inputxtfield.getText().indexOf(“.”)>=0&&inputxtfield.getText().indexOf(“.”)

当原始
字符串
中的最后两个字符之前有一个小数点时,它将为
转换为
大小数
,并检查
比例

double[] values = { 2.11, 2.5, 2.6, 2.22, 2.3, 2.2, 3.141 };
for (double value : values) {
    boolean fail = (BigDecimal.valueOf(value).scale() > 2);
    System.out.println(value + "  " + (fail ? "Fail" : "Pass"));
}
输出

2.11通过
2.5通行证
2.6通行证
2.22通行证
2.3通行证
2.2通行证
3.141失败

这不起作用。计算机以二进制方式工作。请记住,1/3等于0.33333333,具有无限位数。计算机只能存储有限数量的二进制数字,因此它会在某些数字后剪切。这意味着1/3*3!=1。二进制中的任何数字也是如此,这意味着1/100*100不是1,因为您刚刚丢失了一些小数位。工作如果使用double,您将永远无法使用标准=或!=运算符,因为它们在大多数时间都无法工作


在您的情况下,解决此问题的最佳方法是直接使用字符串并查看“.”字符的位置。

尝试使用
Double
类中的
compareTo

Double numInput;
Double foo = numInput*100;
foo = foo - foo.intValue();

if (foo.compareTo(0D) > 0 ) {

   //has more than two digits

}

我没有很好地理解这个问题,最重要的是,将完整的codeget索引放在“.”上,并从双精度的长度中减去这个索引,hehI只需使用正则表达式(
^[0-9]*\.[0-9]{0,2}$
)检查字符串输入,然后再将其转换为双精度。
新的BigDecimal(string.valueOf(doubleNumber)).scale()>2
.Ref:如果用户键入
123.4500
,则此操作失败,即使该数字在技术上是好的。@安德烈亚斯:问题是检查该输入是否有两位小数,即使它们是零,也不是真的。即使您的输入是有效的,也可以通过创建允许任何零数的正则表达式来解决总之,验证输入文本的总体思路比将其转换为双精度,然后尝试对其进行推理更明智,+1。@NathanHughes问题是“双精度变量有两个以上的小数”。问题不是问如何检查文本字段,即使这是值的来源。现在,一个好的答案可以建议作为替代,但这个答案在没有通知的情况下偏离了问题。@Andreas:因为OP似乎不知道表示问题,我想很难知道问题的真正含义。Th是正确的方法。
new BigDecimal(String.valueOf(doubleNumber)).scale()>2
.Ref:@ShanikaEdiriweera答案中使用的方法实现为
返回新的BigDecimal(Double.toString(val))因此,这个旧答案所显示的是正确的方法,并且自Java 1.5中添加以来一直如此。它使用Java运行时库提供的便利方法来简化代码。