gpt4 book ai didi

java - 解释为什么这可以找到两个等于小数点后三位的数字

转载 作者:行者123 更新时间:2023-12-02 01:13:30 25 4
gpt4 key购买 nike

尝试理解为什么这段代码可以找到两个等于小数点后三位的数字。

选角(int)让我措手不及(无法理解它)......

public static boolean areEqualByThreeDecimalPlaces(double firstValue, double secondValue) {
int moveThreeDecimalPlacesToRight = (int) Math.pow(10, 3);
return (int) (firstValue * moveThreeDecimalPlacesToRight) == (int) (secondValue * moveThreeDecimalPlacesToRight);
}

最佳答案

首先请查看 Specification 并了解强制转换表达式的工作原理。

根据该章,这里有一个简短的摘要:

  • intValue * doubleValue 将是 double
  • 您可以强制转换(在本例中为向下强制转换)类型,以便将 (int)(doubleValue * intValue) 强制转换为 int
  • 如果将 double 显式转换为 int,您将丢失小数。

现在让我们逐步分析该代码。

//Just for the example let fisrtValue is 123.456789 and secondValue is 123.456999
double firstValue = 123.456789
double secondValue = 123.456999
(firstValue * moveThreeDecimalPlacesToRight)
// 123.456789 * 1000 will be a double 123456.789
(secondValue * moveThreeDecimalPlacesToRight)
// 123.456999 * 1000 will be a double 123456.999
return 123456.789 == 123456.999 will always return false
(int) (firstValue * moveThreeDecimalPlacesToRight)
// 123.456789 * 1000 will be an int 123456
(int) (secondValue * moveThreeDecimalPlacesToRight)
// 123.456999 * 1000 will be an int 123456

终于

return (int) (firstValue * moveThreeDecimalPlacesToRight) == (int) (secondValue * moveThreeDecimalPlacesToRight);
// return 123456 == 123456 will return true
public static boolean areEqualByThreeDecimalPlaces(double firstValue, double secondValue) {
// Math.pow(...) retuns a double so it have to downcast to int
int moveThreeDecimalPlacesToRight = (int) Math.pow(10, 3);
/*
* We don't care about just the first three decimal places
* If fisrtValue is 123.456789 then
* firstValue * moveThreeDecimalPlacesToRight will be 123456.789
* and secondValue * moveThreeDecimalPlacesToRight will be 123456.999
* so both of them must be downcasted to int
* because 123456.789 will never be equal to 123456.999
*/
return (int) (firstValue * moveThreeDecimalPlacesToRight) == (int) (secondValue * moveThreeDecimalPlacesToRight);
}

更新

根据@Eritrean 的建议,我不得不提到这是一个非常糟糕的主意。根据 Conversion Specification 更准确地说,缩小原始转换部分:

A narrowing primitive conversion may lose information about the overall magnitude of a numeric value and may also lose precision and range.

因此,如果您有一个大的双数,向下转换为 int,那么您的方法可能会返回误报值。

我刚刚找到了两个(或更多)更好的选项来解决您的问题:

关于java - 解释为什么这可以找到两个等于小数点后三位的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59012833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com