Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.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/9/google-apps-script/5.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,请原谅这个问题中明显的“我可能已经知道这个”元素,但我没有看到一种方法,我可以运行这个评估的部门部分,以得到真实的结果 我正在寻找一个函数,该函数将以特定精度的浮点形式返回结果,这样下面的函数就可以工作了 float a = 0.66; if( magicPrecisionFunction(2.0f/3.0f , 2) == a){ //the 2 specifies the level of precision //something } 我意识到我可以在2分钟内自己编写这篇文章,但

请原谅这个问题中明显的“我可能已经知道这个”元素,但我没有看到一种方法,我可以运行这个评估的部门部分,以得到真实的结果

我正在寻找一个函数,该函数将以特定精度的浮点形式返回结果,这样下面的函数就可以工作了

float a = 0.66;

if( magicPrecisionFunction(2.0f/3.0f , 2) == a){ //the 2 specifies the level of precision
   //something
}
我意识到我可以在2分钟内自己编写这篇文章,但我希望找到一种Java本机方法来“正确地”完成这项工作

您可以使用它,它将完全满足您的需要, 您可以创建所需的数字,并使用MathContext设置精度

    BigDecimal b1 = new BigDecimal("2.0");
    BigDecimal b2 = new BigDecimal("3.0");
    BigDecimal ans = b1.divide(b2, new MathContext(2)); // 2 is precision
你可以使用它,它会完全满足你的需要, 您可以创建所需的数字,并使用MathContext设置精度

    BigDecimal b1 = new BigDecimal("2.0");
    BigDecimal b2 = new BigDecimal("3.0");
    BigDecimal ans = b1.divide(b2, new MathContext(2)); // 2 is precision
多麽接近

if (Math.round(100.0f * 2.0f/3.0f) == 66) {
  ..
}
编辑:啊。。。没有抓住重点。。。不是圆的,而是截形的。在这种情况下:

if ((int)(100.0f * 2.0f / 3.0f) == 66) {
  ...
}
多麽接近

if (Math.round(100.0f * 2.0f/3.0f) == 66) {
  ..
}
编辑:啊。。。没有抓住重点。。。不是圆的,而是截形的。在这种情况下:

if ((int)(100.0f * 2.0f / 3.0f) == 66) {
  ...
}

如果您想要精度,我不会使用
float
,因为
double
编写起来更简单,可以提供半万亿倍的精度

类似于@rofl的例子

int n = 2, d = 3;
if ((long)(100.0 * n / d) == 66) {
  ...
}
这不仅比使用BigDecimal快100倍,而且代码编写起来也更短

顺便说一句,将double转换为BigDecimal的正确方法是使用valueOf

BigDecimal bd = BigDecimal.valueOf(0.1);
System.out.println(bd); // prints 0.1

如果您想要精度,我不会使用
float
,因为
double
编写起来更简单,可以提供半万亿倍的精度

类似于@rofl的例子

int n = 2, d = 3;
if ((long)(100.0 * n / d) == 66) {
  ...
}
这不仅比使用BigDecimal快100倍,而且代码编写起来也更短

顺便说一句,将double转换为BigDecimal的正确方法是使用valueOf

BigDecimal bd = BigDecimal.valueOf(0.1);
System.out.println(bd); // prints 0.1


使用double或float,您将永远无法获得浮点数字的精确值。如果要处理这些数字,请改用
BigDecimal
。很抱歉,这是一个你应该已经知道的问题。我不认为你指的是无理数。在浮点类型中可以表示的每个有限数都是有理数。好的,您可以对结果进行四舍五入。如果你看到的文档你可以用啊!这就是BigDecimal的秘密。很高兴知道!非常感谢。请您将标题更改为“我如何比较有理数”:)我已尝试编辑,但被拒绝。使用double或float,您将永远无法获得浮点数的精确值。如果要处理这些数字,请改用
BigDecimal
。很抱歉,这是一个你应该已经知道的问题。我不认为你指的是无理数。在浮点类型中可以表示的每个有限数都是有理数。好的,您可以对结果进行四舍五入。如果你看到的文档你可以用啊!这就是BigDecimal的秘密。很高兴知道!非常感谢。请您将标题改为“我如何比较有理数”:)我已经尝试过编辑,但被拒绝了。是什么让您认为它无法返回67?是的,我认为Math.floor可以工作,而且,正如我所说,我可以自己写这样的东西,但是我很好奇是否有一个内置的Java机制来处理这个问题。BigDicimald是一个大而慢的答案。Yoy会在一个紧密的循环中注意到这种影响……是什么让你认为它不能返回67?是的,我认为Math.floor可以工作,而且,正如我所说的,我自己也可以写这样的东西,但我很好奇是否有一个内置的Java机制来处理这个问题。BigDicimald是一个大而慢的大锤答案。Yoy会注意到紧密循环中的影响…很有趣。您传入一个字符串以返回结果对象?您不必传入字符串,这个构造函数可以包含许多类,请看it@Dr.Dredel因为如果传递一个
double
float
BigDecimal
实例将使用错误的数字,即0.1可能是0.999999…是的,double非常糟糕,如果需要精确的计算,则应始终使用BigDecimalcalculations@Dr.Dredel如果你想在金融应用领域工作,这一点至关重要(只是为了让你知道并且不想破坏金融体系(=)。有意思。你传入一个字符串以返回结果对象?你不必传入字符串,这个构造函数可以包含许多类,请看it@Dr.Dredel因为如果传递一个
double
float
BigDecimal
实例将使用错误的数字,即0.1可能是0.999999…是的,双精度是非常糟糕,如果需要精确的数据,您应该始终使用BigDecimalcalculations@Dr.Dredel如果你想从事金融应用,这一点至关重要(只是为了让你知道,不想破坏金融体系(=)。