代码之家  ›  专栏  ›  技术社区  ›  Douglas

在执行“longProperty1.divide(longProperty2)”时,如何不丢失小数点?

  •  -1
  • Douglas  · 技术社区  · 7 年前

    LongProperty (长字符中没有小数点) 变量( longProperty1 longProperty2 ). 我需要对它们进行除法,并将除法结果保存在一个 DoubleProperty (双精度小数点) 变量( result )

    final DoubleProperty result = new SimpleDoubleProperty(0.0);
    final LongProperty longProperty1 = new SimpleLongProperty(45);
    final LongProperty longProperty2 = new SimpleLongProperty(7);
    result.bind(longProperty1.divide(longProperty2));
    System.out.println(result.get()); //print: "6.0" instead of "6.428571428571429" (lost decimal places)
    

    longProperty1 longProperty2 LongProperty 因为他们收到的数字非常大,所以我无法将其转换为 DoubleProperties .

    后果 0.0 1.0 0.2975 , 0.5378 , 0.9853 )因为我真正的问题是 longProperty1 <= longProperty2 (例如: 500/600=0.8333 , 1/2=0.5 1897/5975=0.3174 , ...).

    2 回复  |  直到 7 年前
        1
  •  1
  •   user1803551    7 年前

    提供的方法 LongProperty (和其他 NumberExpression divide 都是方便的方法。您可以创建一个自定义绑定,它可以执行您想要的任何操作:

    final DoubleProperty result = new SimpleDoubleProperty(0.0);
    final LongProperty longProperty1 = new SimpleLongProperty(812323534);
    final LongProperty longProperty2 = new SimpleLongProperty(956745323);
    result.bind(Bindings.createDoubleBinding(() -> longProperty1.longValue() / (double) longProperty2.longValue(),
        longProperty1, longProperty2));
    System.out.println(result.get());
    longProperty1.set(612323534);
    System.out.println(result.get());
    

    Bindings 是用于创建绑定的实用程序类。在这里,我创建了一个自定义绑定,返回一个 double long s至 . 你会在这里失去准确性。

    上述输出为:

    0.8490488685670847
    0.6400068223798362
    
        2
  •  0
  •   Aleksandr    7 年前

    你应该使用 BigDecimal 供您计算。
    LongProperty

    你可以试试 longProperty1.divide(longProperty2.doubleValue()) 同样,这将调用 DoubleBinding divide(final double other) ,但我认为这将消除使用 .