【问题标题】:Remove '.0' from double, but keep every other possibility从双精度中删除“.0”,但保留所有其他可能性
【发布时间】:2017-04-02 03:51:23
【问题描述】:

我在 Stackoverflow 上看到了很多关于在双精度后隐藏 .0 的问题,但每个答案都说要使用 DecimalFormat 并使用 #.# 来隐藏它。除非这不是我想要的。

对于双精度不以.0 结尾的每一种可能性,我希望它们保持原样。除非它确实以.0 结尾,否则将其删除。换句话说,我希望始终保持精确,除非它以 .0 结尾。

例子:

0.0000000000000000042345470000230 -> 0.0000000000000000042345470000230
0.4395083451 -> 0.4395083451
46547453.00024235 -> 46547453.00024235

435.0 -> 435

有什么方法可以实现吗?

进一步的例子:

这个问题here有我所说的答案类型:

使用十进制格式

double answer = 5.0;
DecimalFormat df = new DecimalFormat("###.#");
System.out.println(df.format(answer));

上面的###.# 意味着我将出现前3 个数字,一个句点,然后是它后面的第一个数字。不管我的值是多少,只有第一个小数会被格式化。

【问题讨论】:

  • 为什么投反对票?这个问题没有任何题外话,因为它指的是编程。此外,没有“最小可验证示例”,因为我不知道如何编写代码。
  • 这是格式问题,与特定数据类型无关。
  • @HovercraftFullOfEels 示例纯属示例。我提供的数字长度的愚蠢只是极端的例子,表明它们只是.0结尾。我知道他们没有实际上按原样表示。
  • @frayment 你有点困惑,如果你想将双精度数作为整数来管理,那么你的方法是错误的。如果您将其用于计算,请继续使用浮点数。然后,如果您需要将其打印到报告/用户界面中,请使用一些很酷的类作为 DecimalFormat 对其进行格式化。
  • 知道了,是时候开始使用BigDecimal了。

标签: java formatting double


【解决方案1】:

其实它一点也不复杂。只需检查一下(它甚至可以为您提供最精确的数字):

//Square root of 5 will give you a lot of decimals    
BigDecimal d1 = new BigDecimal(sqrt(5));
//5 will give you none
BigDecimal d2 = new BigDecimal(5);
//Print and enjoy
System.out.println(d1.stripTrailingZeros());
System.out.println(d2.stripTrailingZeros());

stripTrailingZeros() 将删除任何纯 0 的痕迹,但如果存在其他数字,则保留格式。

【讨论】:

  • 天哪,这东西的精确度。 :O
  • 好吧,我刚刚尝试过,并且不得不使用setScale 设置精度,因为我使用的数字非常长。我在一个数字上使用了d = d.setScale(10, RoundingMode.FLOOR);,现在它等于500.0000000000。我打印了这个,后面的零还在吗?
  • 再次,这只是一个感知问题,打印 d.intValue() 你将得到 500。
  • @Euclides 是的,但这不是我所追求的。那仍然会删除我的小数尾随。无论如何我找到了答案,只需使用skipTrailingZeros()
  • 太棒了!我很高兴你终于找到了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
相关资源
最近更新 更多