当前位置: 首页 > 面试题库 >

Java精度损失

微生信鸿
2023-03-14
问题内容

我有一个关于精度损失的问题

我的任务是将数字打印为字符串

int exponent = ...
int[] Mantissas = { 1, 2, 5 };
double dataStep = java.lang.Math.pow(10.0, exponent) * Mantissas[mantissaIndex];
...
for (int i = 0; i < NSteps; i++)
                    steps[i] = firstStep + i * dataStep;
draw(steps);

例如0.2 * 7 = 1.4000000000000001; 0.0000014 / 10 = 1.3999999999999998E-7

如何解决这个问题?

UPD :主要问题是 字符串
输出格式。我不担心丢失约0.00000001的值。现在,我将其解析为String.format(“%f”,value),但我认为这不是一个好方法


问题答案:

正如其他人所提到的,您必须使用 java.math.BigDecimal 而不是float / double。但是,这带来了自己的一系列问题。

例如,当您调用BigDecimal(double)时,您传入的值将扩展为其完整表示形式:

BigDecimal oneTenth = new BigDecimal(0.1);
BigDecimal oneMillion = new BigDecimal(1000000);
oneTenth.multiply(oneMillion)
out> 100000.0000000000055511151231257827021181583404541015625000000

但是,当您使用BigDecimal(String)构造函数时,会表示eact值,并且您得到

BigDecimal oneTenth = new BigDecimal("0.1");
BigDecimalr oneMillion = new BigDecimal(1000000);
oneTenth.multiply(oneMillion)
out> 100000.0

您可以在Joshua Bloch和Neal
Gafter的出色的Java益智类书籍以及这篇内容丰富的文章中了解有关BigDecimal限制的更多信息。最后请注意,BigDecimal上的toString将以科学计数法打印,因此您必须正确地使用
toPlainString



 类似资料:
  • 问题陈述: 编写一个方法whatTime,它采用int,seconds,表示从某一天午夜开始的秒数,并返回一个格式为“:”的字符串。此处,表示自午夜以来的完整小时数,表示自上一完整小时结束以来的完整分钟数,以及自上一完整分钟结束以来的秒数。和中的每一个都应该是整数,没有额外的前导0。因此,如果秒为0,则应返回“0:0:0”,而如果秒为3661,则应返回“1:1:1” 我的算法: 以下是我的算法对输

  • 有人知道为什么。

  • 问题内容: 我的代码是 编译时出现以下错误 但是,当我使用它代替它成功编译时,那么我的问题是,当所有3个变量(即a,b和c)都是字节数据类型时,为什么需要强制转换? 问题答案: ,此处的运算符将返回,这就是您需要使用强制转换的原因。

  • 我需要解析一个给定的类型(例如:长整型),它用科学记数法表示。例子: 我知道给定字符串的类型,但我不能使用strtoll,因为数字是用科学符号表示的。我所做的是使用strtod转换它,对int64_t进行错误检查,并将其转换回int64_t。ErrCheckInt和ErrCheck Double对整型和浮点型进行错误检查(溢出、下溢等),并将数字强制转换为任何类型。 问题是,当我用双精度解析int

  • 我有一个只有完全连接/密集层的深度网络,形状为128-256-512-1024-1024所有层使用激活,没有,最后一层使用激活。 在第20次训练后,验证/测试损失开始逆转并上升,但测试精度也在继续提高。这怎么说得通?如果显示了新的数据,测试的准确性是否准确,或者是否存在某种假阳性? 我这样编译模型:

  • 我的团队正在Tensorflow中训练一个CNN对损坏/可接受部件进行二进制分类。我们通过修改cifar10示例代码来创建我们的代码。在我以前的神经网络经验中,我总是训练到损失非常接近于0(远低于1)。然而,我们现在在训练期间(在一个单独的GPU上)用一个验证集来评估我们的模型,看起来精度在大约6.7K步数后停止增长,而损失在超过40K步数后仍在稳步下降。这是因为过装吗?一旦损失非常接近于零,我们