Java 为什么Box2D必须使用浮点值?

Java 为什么Box2D必须使用浮点值?,java,floating-point,jbox2d,Java,Floating Point,Jbox2d,在查看了使用JBox-2D引擎的代码之后,很明显,浮点声明经常被使用: float x = 20.0f //<-- float FixtureDef fixDef = new FixtureDef(); fixDef.shape = shape; fixDef.density = 0.0f; //<-- float fixDef.friction = 0.9f; //<-- float float x=20.0f/如果将0.9这样的数字分配给一个float,那么在某些情况下

在查看了使用JBox-2D引擎的代码之后,很明显,浮点声明经常被使用:

float x = 20.0f //<-- float

FixtureDef fixDef = new FixtureDef();
fixDef.shape = shape;
fixDef.density = 0.0f; //<-- float
fixDef.friction = 0.9f; //<-- float

float x=20.0f/如果将0.9这样的数字分配给一个float,那么在某些情况下,如果将其声明为0.9f,结果将比将其声明为0.9(双精度),然后从双精度转换为浮点精度更高。用“f”将其声明为float文本将永远不会比将其声明为double并强制转换为float更糟糕

与声明与浮点字面值相同的值相比,将int字面值赋给浮点字面值不会有精度损失,但是如果所有操作都是在浮点字中完成的,那么让所有字面值都浮点,而不仅仅是非整数字面值,就更整洁了。这样,如果文字后来从整数变为分数,“f”就已经存在了

================================================================================

问题的根源是在从十进制字符串转换为双精度字符串的过程中丢失有关文本的信息。下面是一个如何实现这一点的示例

假设一个小数点略大于一个正好位于两个相邻浮点数中间的双精度小数点,并且两个浮点数中较低的一个为偶数(最后一位为零)

小数点更接近两个浮点数中较大的一个,因此在直接转换为浮点数时舍入小数点。如果通过double进行转换,则舍入到double将丢失该信息。Double-to-float转换使用round-half-偶数,它将两个相邻float之间的双半路映射到偶数,在本例中是较小的一个

下面是一个程序,演示了这一点:

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(通过双精度转换的结果)的绝对舍入误差。

如果将0.9之类的数字分配给浮点,则在某些情况下,如果将其声明为0.9f,结果将比将其声明为0.9(双精度)时更准确,然后从双人到浮动。用“f”将其声明为float文本将永远不会比将其声明为double并强制转换为float更糟糕

与声明与浮点字面值相同的值相比,将int字面值赋给浮点字面值不会有精度损失,但是如果所有操作都是在浮点字中完成的,那么让所有字面值都浮点,而不仅仅是非整数字面值,就更整洁了。这样,如果文字后来从整数变为分数,“f”就已经存在了

================================================================================

问题的根源是在从十进制字符串转换为双精度字符串的过程中丢失有关文本的信息。下面是一个如何实现这一点的示例

假设一个小数点略大于一个正好位于两个相邻浮点数中间的双精度小数点,并且两个浮点数中较低的一个为偶数(最后一位为零)

小数点更接近两个浮点数中较大的一个,因此在直接转换为浮点数时舍入小数点。如果通过double进行转换,则舍入到double将丢失该信息。Double-to-float转换使用round-half-偶数,它将两个相邻float之间的双半路映射到偶数,在本例中是较小的一个

下面是一个程序,演示了这一点:

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(通过双精度转换的结果)的绝对舍入误差。

如果将0.9之类的数字分配给浮点,则在某些情况下,如果将其声明为0.9f,结果将比将其声明为0.9(双精度)时更准确,然后从双人到浮动。用“f”将其声明为float文本将永远不会比将其声明为double并强制转换为float更糟糕

与声明与浮点字面值相同的值相比,将int字面值赋给浮点字面值不会有精度损失,但是如果所有操作都是在浮点字中完成的,那么让所有字面值都浮点,而不仅仅是非整数字面值,就更整洁了。这样,如果文字后来从整数变为分数,“f”就已经存在了

================================================================================

问题的根源是在从十进制字符串转换为双精度字符串的过程中丢失有关文本的信息。下面是一个如何实现这一点的示例

假设一个小数点略大于一个正好位于两个相邻浮点数中间的双精度小数点,并且两个浮点数中较低的一个为偶数(最后一位为零)

小数点更接近两个浮点数中较大的一个,因此在直接转换为浮点数时舍入小数点。如果通过double进行转换,则舍入到double将丢失该信息。Double-to-float转换使用round-half-偶数,它将两个相邻float之间的双半路映射到偶数,在本例中是较小的一个

下面是一个程序,演示了这一点:

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(通过双精度转换的结果)的绝对舍入误差。

如果将0.9之类的数字分配给浮点,则在某些情况下,如果将其声明为0.9f,结果将比将其声明为0.9(双精度)时更准确,然后从双人到浮动。用“f”将其声明为float文本将永远不会比将其声明为double并强制转换为float更糟糕

与声明与浮点字面值相同的值相比,将int字面值赋给浮点字面值不会有精度损失,但是如果所有操作都是在浮点字中完成的,那么让所有字面值都浮点,而不仅仅是非整数字面值,就更整洁了。这样,如果文本稍后从整数更改为fr,则“f”已经存在