Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.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_Floating Point - Fatal编程技术网

Java 这个数字是否相等?

Java 这个数字是否相等?,java,floating-point,Java,Floating Point,假设我们有两个文本字段: 第一个文本字段-用户输入金额-可以是小数点后两位的任意金额(3456.23555555.5、23.44等) 第二个文本字段-用户输入一个金额,将其平分为(2、7、1等) 然后,我们如何检查此计算的结果是否是精确的分割(小数点后两位)?例如 您可以使用BigDecimal的divide()方法: public static boolean isExactSplit (BigDecimal number, int nbParts) { try { n

假设我们有两个文本字段:

第一个文本字段-用户输入金额-可以是小数点后两位的任意金额(3456.23555555.5、23.44等)

第二个文本字段-用户输入一个金额,将其平分为(2、7、1等)

然后,我们如何检查此计算的结果是否是精确的分割(小数点后两位)?例如


您可以使用
BigDecimal
divide()
方法:

public static boolean isExactSplit (BigDecimal number, int nbParts) {
    try {
        number.divide(new BigDecimal(nbParts), 2, RoundingMode.UNNECESSARY);
        return true;
    } catch (ArithmeticException roundingError) {
        return false;
    }
}
BigDecimal
javadoc:

抛出:

算术异常-如果除数==0,或roundingMode==roundingMode.Understance,且此.scale()不足以精确表示除法结果

您可以这样使用它:

System.out.println(isExactSplit(new BigDecimal("54.2"), 2)); // prints true
System.out.println(isExactSplit(new BigDecimal("61.05"), 2)); // prints false

您可以使用
BigDecimal
divide()
方法:

public static boolean isExactSplit (BigDecimal number, int nbParts) {
    try {
        number.divide(new BigDecimal(nbParts), 2, RoundingMode.UNNECESSARY);
        return true;
    } catch (ArithmeticException roundingError) {
        return false;
    }
}
BigDecimal
javadoc:

抛出:

算术异常-如果除数==0,或roundingMode==roundingMode.Understance,且此.scale()不足以精确表示除法结果

您可以这样使用它:

System.out.println(isExactSplit(new BigDecimal("54.2"), 2)); // prints true
System.out.println(isExactSplit(new BigDecimal("61.05"), 2)); // prints false

您可以将除法的结果乘以100,然后使用模来检查它是否有非零的小数部分

if (((number*100) % 1) == 0) {
    // exact
} else {
    // not exact
} 

您可以将除法的结果乘以100,然后使用模来检查它是否有非零的小数部分

if (((number*100) % 1) == 0) {
    // exact
} else {
    // not exact
} 

你所问的问题相当于“是
number*100
可被
split
整除”。你可以将你的
BigDecimal
乘以100,转换成
biginger
,然后使用
mod
进行检查。

你所问的问题相当于“是
number*100
可以被
拆分
整除”。您可以将您的
BigDecimal
乘以100,转换为
biginger
,并使用
mod
进行检查。

将输入值乘以100,按拆分进行模化,并检查余数是否为零:

(54.20 * 100) % 2 = 0
(61.05 * 100) % 2 = 1

将输入值乘以100,按拆分进行模运算,并检查余数是否为零:

(54.20 * 100) % 2 = 0
(61.05 * 100) % 2 = 1

您可以将答案作为字符串获取,然后通过正则表达式将其拆分为标记
[.]
,并检查尾随小数的长度:

String decimals = Float.toString(f);
String[] tokens = decimals.split("[.]");
return tokens[1].length() == 2;

您可以将答案作为字符串获取,然后通过正则表达式将其拆分为标记
[.]
,并检查尾随小数的长度:

String decimals = Float.toString(f);
String[] tokens = decimals.split("[.]");
return tokens[1].length() == 2;

你说的“精确分割”是什么意思?61.05/2正好是30。525@Warlord精确拆分为两位小数
如果(第二位小数是奇数){不会均匀拆分}
。除数也是一个输入,那么“精确拆分”是什么意思?61.05/2正好是30。525@Warlord如果(第二位小数是奇数){不会平均分割},则精确分割为两位小数。。除了除数也是一个InputDecimal之外,在这种情况下实际上需要BigDecimal,但这取决于测试的值。@keshlam我更正了答案(我第一次发布的速度太快)。我认为使用
BigDecimal
是个好主意,原因有两个:避免浮点数的问题,因为它已经提供了所需的内容(检查刻度是否足以表示除法的结果)。在这种情况下,实际上需要不清楚的BigDecimal,但这确实取决于测试的值。@keshlam我更正了答案(第一次发布的速度太快了)。我认为使用
BigDecimal
是个好主意,原因有两个:避免浮点数的问题,因为它已经提供了所需的内容(检查刻度是否足以表示除法的结果)。这不是真的,如果第三个小数位为零,但是小数点后第四位有一个非零数字,或者更进一步?@warrord OP表示“任何数量都可以达到小数点后两位”,但他也表示您可以除以除2以外的其他数字(@warrord BTW,您的答案使用模1,它将始终具有零的余数…@warrord Yes;我的答案是除以模;因此,如果您愿意,在所提供的示例中是“2”,或者是“7”…这不是真的,如果第三个小数点位是零,但第四个小数点位有一个非零数字,或者更进一步,会发生什么情况?@Warrord OP表示“任何数量都可以达到两个小数点位”,但他也表示您可以除以除2以外的其他数字(@warrord顺便说一句,你的答案使用模1,它的余数总是为零…@warrord是的;我的答案是通过拆分模;所以在提供的示例中为“2”,或者如果你愿意,为“7”。。。