已关闭。此问题需要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
这里的“精度损失”是指由于传入数据的双重性质而导致的任何精度损失,即对我来说“无精度损失”的计算是对整数进行的计算,整数是从传入数据构建的。
1条答案
按热度按时间u4vypkhs1#
使用引用
Double
代替原始double
作为输入,并转换为BigDecimal
以获得准确性。如果转换是一个循环任务,则可以将其提取到函数中: