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如果你想从事金融应用,这一点至关重要(只是为了让你知道,不想破坏金融体系(=)。