【问题标题】:Is there a better way to convert a Double to it's exact decimal String?有没有更好的方法将 Double 转换为精确的十进制字符串?
【发布时间】:2018-02-15 10:20:13
【问题描述】:

我尝试了很多方法来使用 String.format() 和 DecimalFormater 将 Double 转换为精确的十进制字符串,到目前为止我发现了这一点:

String s = "-.0000000000000017763568394002505";
Double d = Double.parseDouble(s) * 100;
System.out.println((new java.text.DecimalFormat("###########################.################################################################################")).format(d));

(https://ideone.com/WG6zeC)

我不太喜欢我的解决方案,因为制作一个无法涵盖所有​​情况的巨大模式对我来说很难看。

你还有其他方法吗?
我真的想要所有小数,没有科学记数法没有尾随零

谢谢

P.S.:我需要这个没有外部库和 Java 1.7。

【问题讨论】:

  • 您尝试过使用 BigDecimal 吗?
  • 如果你想要exact十进制值,千万不要使用float或double类型。阅读Is floating point math broken?了解更多...
  • 不!与损坏的浮点无关:这个问题在于从 Double 到 String 的转换......
  • 要明确的是,您是要在存储到双精度后完全按原样打印双精度,还是要将双精度打印为精确的十进制表示无论输入是什么?到目前为止,人们似乎都认为你在问的是后者,但我猜你是在问前者,而两者的答案却截然不同。

标签: java string double decimal


【解决方案1】:

似乎您必须处理一些精度问题。 double 不适用于此用途。更好用BigDecimal

String value="13.23000";
BigDecimal bigD=new BigDecimal(value);
System.out.println(bigD);
System.out.println(bigD.stripTrailingZeros().toPlainString());

【讨论】:

  • 谢谢,但这不起作用,因为我得到 2 个尾随零:String s = "-.0000000000000017763568394002505"; BigDecimal bd = new BigDecimal(s); bd = bd.multiply(new BigDecimal(100)); System.out.println(bd.toPlainString()); 返回:“-0.0000000000001776356839400250500”
【解决方案2】:

new BigDecimal("0.1")new BigDecimal(0.1) 之间有很大的不同。使用 String 构造函数可能会导致尾随零,并且在解析字符串时会失去舍入到双精度的效果。如果目标是打印 double 的确切值,则需要使用 BigDecimal 的 double 构造函数。用双精度而不是 BigDecimal 进行任何算术运算。

import java.math.BigDecimal;

public class Test {
  public static void main(String[] args) {
    String s = "-.0000000000000017763568394002505";
    double d = Double.parseDouble(s) * 100;
    System.out.println(new BigDecimal(d).toPlainString());
  }
}

【讨论】:

  • 谢谢,但正如您在这里看到的那样,这不起作用:ideone.com/cwFuqI 我得到“-0.00000000000017763568394002504646778106689453125”但我应该得到“-0.0000000000001706356839”
  • @pierreonthenet 这取决于你想要的,原始字符串或双精度的确切值。没有值为 0.00000000000017763568394002505 的 IEEE 754 64 位二进制浮点数。
  • @pierreonthenet 如果您确实需要精确的十进制值,请考虑使用 BigDecimal 而不是 double 作为您的主要算术类型。
  • 谢谢!所以有一个链接到“浮点数学坏了吗?”,但这对我想做的事情有副作用。
【解决方案3】:

试试这个代码: 您也可以使用 toString() 方法,但它使用科学计数法。 https://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#toPlainString()

BigDecimal bd = new BigDecimal("-.0000000000000017763568394002505");
System.out.println(bd.toPlainString());

【讨论】:

  • 谢谢,但这不起作用,因为我得到 2 个尾随零:String s = "-.0000000000000017763568394002505"; BigDecimal bd = new BigDecimal(s); bd = bd.multiply(new BigDecimal(100)); System.out.println(bd.toPlainString());
猜你喜欢
  • 1970-01-01
  • 2010-12-31
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 2019-08-31
  • 2015-06-14
  • 2014-05-05
相关资源
最近更新 更多