使用Java将双精度值转换为BigInteger值的最佳方法

丹尼尔·穆西格

是否存在将double值转换为BigInteger值并稍后返回的正确方法?在最佳情况下,不会丢失数据。问题是,我不知道双精度值有多少个小数位。但是我需要对仅适用于非十进制值的算法进行此转换。算法完成后,我必须将其转换回去。

我需要的一个简单示例:例如2个双精度值的总和,但“ sum”函数仅适用于BigInteger。

帕特里夏(Patricia Shanahan)

该程序基于BigDecimal-and-scale的想法,就像在assylias的答案中一样,但经过修改后可以无条件使用最大可能的规模。这允许在数字流中使用相同的标度,而无需在处理任何数字之前查看所有数字。代价是它通常会返回不必要的大BigInteger值。

比例因子“ 1e1074”基于以下观察结果:所有有限双精度数都是Double.MIN_VALUE的整数倍,Double.MIN_VALUE具有小数点后的1074个小数位。小数点后没有任何双精度数可以有更多的十进制数字。

import java.math.BigDecimal;
import java.math.BigInteger;

public class Test {
  public static void main(String[] args) {
    testit(Double.MIN_VALUE);
    testit(Double.MAX_VALUE);
    testit(0);
    testit(1.0);
    testit(Math.E);
    testit(Math.PI);
  }

  private static void testit(double d) {
    double roundTrip = scaledIntegerToDouble(doubleToScaledInteger(d));
    if (d != roundTrip) {
      System.out.println("ERROR: " + d + " " + roundTrip);
    }
  }

  public static final BigDecimal scale = new BigDecimal("1e1074");

  public static BigInteger doubleToScaledInteger(double d) {
    BigDecimal bd = new BigDecimal(d).multiply(scale);
    return bd.toBigIntegerExact();
  }

  public static double scaledIntegerToDouble(BigInteger bi) {
    BigDecimal bd = new BigDecimal(bi).divide(scale);
    return bd.doubleValue();
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java反射。将返回值转换为双精度

如何使用RxJava将双精度值的嵌套列表转换为Java类?

将文本框值转换为双精度值

将8个字节转换为双精度值

C ++将变量小数转换为双精度值

将 uint64_t 转换为双精度值

将轨迹栏值转换为双精度

将字符串从Firebase转换为双精度值

将数组int值转换为双精度

将双精度值的 JSONArray 转换为二维双精度数组

Swift 4 - 使用 NSString 将字符串转换为双精度值

如何在将双精度值转换为字符串后从双精度值中删除小数点

在Java中将具有双精度和字符的字符串转换为仅双精度的最佳方法

将E-02的双精度值转换为“正常”值

双精度值不能转换为布尔值

将字符串转换为双精度的最佳方法是什么

将双精度型转换为不带小数位的字符串的最佳方法

Java在Modbus TCP上进行编程以将4个整数寄存器转换为双精度值

Java中将价格范围为8的双精度(表示价格)转换为长整数的最佳方法

Swift JSONSerialization隐式将双精度值转换为字符串

R:根据列索引将数据帧值从整数转换为双精度

从文本文件matlab读取时将单元格转换为双精度值

Swift-将数组中的值转换为双精度或浮点型

将双精度日期和时间值转换为另一个时区?

如何将包含方程式的字符串转换为双精度值?

Matlab:将具有双精度值的单元格转换为字符串

将字符串从共享首选项转换为双精度值

如何将逻辑列转换为 MATLAB 表中的双精度值

当每个键有 5 个值时,将字典值从字符串转换为双精度值