【问题标题】:String to double with precision字符串精度加倍
【发布时间】:2014-05-22 16:45:05
【问题描述】:

我确实有一个从文件中读取的字符串,其值为:38.739793110376837

当我将此值转换为双精度时:

double.parseDouble("38.739793110376837");

我得到结果:38.73979311037684

如何在双变量中获得原始值?

我不想使用 BigDecimal 数据类型。

【问题讨论】:

  • 您想避免舍入错误但又不想使用BigDecimal?嗯?
  • 我只是想在 double 中获得相同的值。
  • 我就离开this这里
  • double 的大小有限,为 64 位,这意味着您只能将这么多信息装入其中。如果您使用 BigDecimal,它几乎可以是任何大小,这就是它不会丢失精度的原因。
  • 得到的结果是double可以表示的最接近的值。它已经在尽力而为。

标签: java string double precision


【解决方案1】:

如何在双变量中获得原始值?

你不能。与您的原始值最接近的double 正好 38.739793110376837148578488267958164215087890625

将转换为“38.73979311037684”,因为这是唯一标识 double 值的最短值。来自documentation

m 或 a 的小数部分必须打印多少位?必须至少有一个数字来表示小数部分,除此之外,必须有尽可能多的数字,但仅能将参数值与相邻的 double 类型值区分开来。也就是说,假设 x 是由该方法为有限非零参数 d 生成的十进制表示所表示的精确数学值。那么 d 必须是最接近 x 的 double 值;或者如果两个双精度值同样接近 x,则 d 必须是其中之一,并且 d 的有效位的最低有效位必须为 0。

如果您想完全保留您的原始值,您应该使用BigDecimal

【讨论】:

  • 这证明了您不能在 double 中准确地表示该值,因为我的示例不处理其他数据类型。 (OP 可能认为这是 parseDouble 的错。)
  • 哦,你完全正确。你认为我应该删除我的评论吗?
  • @2rs2ts: 是的 - 你删除所有你的,我也会删除所有我的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 2018-06-13
  • 1970-01-01
相关资源
最近更新 更多