java 保持整数的精度,以双精度传递[已关闭]

ffscu2ro  于 2023-03-21  发布在  Java
关注(0)|答案(1)|浏览(165)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。

4天前关闭。
这篇文章是编辑和提交审查2天前。
Improve this question
我有一个从外部世界接收双精度数的服务。我确信所有的双精度数在小数点后只有4位。* 需要强调的是,发送数据给我的原始系统使用5位整数,所以所有“后面”这5位数字的数据都是无意义和误导的。* 为了保持精度,我想将传入的双精度数转换为整数,使用整数,然后将它们转换回双精度值以返回。我看到理论上,知道输入在小数点后总是有4位数字,我应该不会失去精度,考虑到***我只对这些数字应用加/减***。不涉及除法和乘法。

  • 1.2345来找我,我知道1.23456789来不了
  • 我将它乘以10,000,并在不损失精度的情况下处理整数
  • 然后我可以将它除以10,000并发送回来,没有/* 操作,因此我最终在小数点后得到相同的4位数

我在这里失去了准确性:

double[] n = {1.3456, 6.0000, 1.9999, 7.0001};
int[] in = new int[4];
double[] od = new double[4];
for (int i = 0; i < 4; i++) {
    in[i] = (int) (n[i] * 10_000);
}
for (int i = 0; i < 4; i++) {
    od[i] = ((double)in[i] / 10_000.0);
}
System.out.println(Arrays.toString(n)); //
System.out.println(Arrays.toString(in));
System.out.println(Arrays.toString(od));

上面的代码给了我…

[1.3456, 6.0, 1.9999, 7.0001]
[13455, 60000, 19999, 70001]
[1.3455, 6.0, 1.9999, 7.0001]

这已经很不好了

问题:

是否有可能完全消除精度损失?我认为只有一个选择:double〉string〉integer〉对整数的操作〉construct string〉build double,但是这是相当费力的,我使用的是Java,但是我认为这在这里并不重要。
PS
这里的“精度损失”是指由于传入数据的双重性质而导致的任何精度损失,即对我来说“无精度损失”的计算是对整数进行的计算,整数是从传入数据构建的。

u4vypkhs

u4vypkhs1#

使用引用Double代替原始double作为输入,并转换为BigDecimal以获得准确性。

public static void main(String args[]) {

    Double[] n  = {1.3456, 6.0000, 1.9999, 7.0001};
    int[] in    = new int[4];
    double[] od = new double[4];

    final BigDecimal tenK = BigDecimal.valueOf(10000);

    for (int i=0;i<4;i++) {
        in[i] = BigDecimal.valueOf(n[i]).multiply(tenK).intValue();
    }

    for (int i=0;i<4;i++) {
        od[i] = in[i] / tenK.doubleValue();
    }

    System.out.println(Arrays.toString(n)); 
    System.out.println(Arrays.toString(in));
    System.out.println(Arrays.toString(od));
}

如果转换是一个循环任务,则可以将其提取到函数中:

public static void main(String args[]) {

    Double[] n  = {1.3456, 6.0000, 1.9999, 7.0001};
    int[] in    = new int[4];
    double[] od = new double[4];

    final BigDecimal tenK = BigDecimal.valueOf(10000);

    final DoubleToIntFunction multiplyBYTenK = d -> BigDecimal.valueOf(d).multiply(tenK).intValue();
    final IntToDoubleFunction divideByTenK   = i -> i / tenK.doubleValue();

    Arrays.setAll(in, i -> multiplyBYTenK.applyAsInt(n[i]));
    Arrays.setAll(od, i -> divideByTenK.applyAsDouble(in[i]));

    System.out.println(Arrays.toString(n)); //
    System.out.println(Arrays.toString(in));
    System.out.println(Arrays.toString(od));
}

相关问题