使用Jbox-2D引擎查看代码后,很明显,Float声明经常使用:
float x = 20.0f //<-- float
FixtureDef fixDef = new FixtureDef();
fixDef.shape = shape;
fixDef.density = 0.0f; //<-- float
fixDef.friction = 0.9f; //<-- float
我已经修补了,发现当代码不被指定为浮子时,该代码会正确符合。因此,我的问题是:
为什么编码器必须将值定义为Jbox-2D中的浮动,即使存储在其中的变量已经被声明为float?
如果要将0.9之类的数字分配给浮点是双重的,然后从双重到浮动。将其宣布为" float"字面意义,其中" f"永远不会比宣布双重并施放浮动更糟。
与宣布与浮点文字相同的值相比,将int字面的字面分配给浮点没有精确的损失,但是如果在float中完成一切,都可以使所有文字浮动更加整洁,而不仅仅是非全能的。这样,如果文字后来从整数更改为分数,则" F"就已经存在。
=========================================================================================
问题的根源是在从小数线到两倍的转换过程中有关文字的信息丢失。以下是如何发生这种情况的示例。
假设小数分数非常略大于两个相邻浮子之间的一半,而两个浮子的下部甚至是均匀的(最后一个位为零)。
小数分数更靠近两个浮子中的较大,因此直接转换为浮子时,它绕过它。如果转换是通过double完成的,则可以双重丢失该信息的舍入。双向转换使用圆形转换 - 甚至在两个相邻浮子之间映射了一半的一半,在这种情况下,在这种情况下,较小的浮子。
这是一个证明这一点的程序:
import java.math.BigDecimal;
public class Test {
public static void main(String[] args) {
BigDecimal exactValue = new BigDecimal("1.5000000596046447753906251");
System.out.println("Exact = " + exactValue);
double d = 1.5000000596046447753906251;
BigDecimal dValue = new BigDecimal(d);
System.out.println("dValue = " + dValue);
float f1 = 1.5000000596046447753906251f;
BigDecimal f1Value = new BigDecimal(f1);
System.out.println("f1Value = " + f1Value);
float f2 = (float) 1.5000000596046447753906251;
BigDecimal f2Value = new BigDecimal(f2);
System.out.println("f2Value = " + f2Value);
System.out.println("f1 error = "
+ exactValue.subtract(f1Value).abs());
System.out.println("f2 error = "
+ exactValue.subtract(f2Value).abs());
}
}
输出:
Exact = 1.5000000596046447753906251
dValue = 1.500000059604644775390625
f1Value = 1.50000011920928955078125
f2Value = 1.5
f1 error = 5.96046447753906249E-8
f2 error = 5.96046447753906251E-8
直接转换的结果,F1的绝对舍入误差小于F2的绝对舍入误差,这是通过双重转换的结果。