gpt4 book ai didi

java - 如何以全精度输出本地化的 Java 浮点值?

转载 作者:搜寻专家 更新时间:2023-10-31 08:04:32 28 4
gpt4 key购买 nike

如果我使用 toString 方法格式化 double ,那么我将获得 double 的完整精度。例如(使用 Scala 语法):

java.text.MessageFormat.format ("{0}", Math.PI.toString)

将产生一个包含以下内容的字符串:

3.141592653589793

但是,此值未本地化。如果我将 double 值作为盒装 Double 传递,则为:

java.text.MessageFormat.format ("{0}", Math.PI.asInstanceOf[AnyRef])

(AnyRefScala类型,相当于Java中的Object),则结果为具有截断精度的本地化字符串:

3.142

即使我在格式字符串中添加更多提示,结果也是一样的:

java.text.MessageFormat.format ("{0,number}", Math.PI.asInstanceOf[AnyRef])

我可以通过指定自定义格式获得完整的精度:

java.text.MessageFormat.format ("{0,number,#.###############}", Math.PI.asInstanceOf[AnyRef])

但这需要对 double 的大小和精度有一些了解。如果我正在打印任何 double 值(不仅仅是 Pi),并且想要保留该值的完整精度,那么这种方法意味着我必须动态更改格式字符串 - 这并不完全是如果(在我的情况下)格式字符串实际上是从资源包中获取的,则很方便。

例如,考虑 1.0e37 的 double 值。首先转换为字符串并使用“{0}”作为格式字符串会生成适当但未本地化的字符串值 1.0E37。如果我将其作为带格式字符串“{0,number}”的盒装 Double 传递,那么我会得到荒谬的值 10,000,000,000,000,000,000,000,000,000,000,000,000

简而言之,我似乎无法找到一种格式字符串,它可以在不首先将 double 转换为字符串的情况下保留 double 的全部精度——这是我希望避免的事情,就像瘟疫一样。 是否有一种数字格式字符串可以将 double 的全精度输出为本地化值?

更新:

只是为了阐明为什么我宁愿不必将 double 转换为字符串:

    据我所知,
  • toString 返回一个有效的 Java double 值。作为字符串,结果在传递给 MessageFormat.format 时未本地化。例如,假设我想输出值 1234.567 的本地化形式。 toString 将返回 "1234.567",而 MessageFormat.format 将保留它。美好的。我有我的精确输出。但是,在德国,如果它显示为 "1.234,567" 会更有意义。即使在美国/英国,如果显示为 "1,234.567" 也会更好看。
  • 如果我将装箱的 IntegerBoolean 或任何其他非浮点基本类型传递给 MessageFormat.format(使用简单的“{n}"格式),然后我得到很好的本地化、全精度输出。我不需要——也不应该,因为我会丢失本地化输出——首先将这些值转换为字符串。这意味着我必须以不同的方式对待 double (以及 float 和 BigDecimal)并将它们转换为字符串,然后再将它们传递给 MessageFormat.format。 (此外,我必须记住每次都这样做。)

最佳答案

MessageFormat 使用本地化表示,带有千位分隔符,可能是十进制逗号等。在您的使用中,它使用您平台的默认语言环境。

一些应该与通用程序员的符号 valueOf/toString 分开的东西。

使用 doubleprecision 有点矛盾,因为十进制表示是 2 的幂和的近似值,而 double 在内部是这样的。

要保留完整信息,您可以使用 Double.doubleToRawLongBits 以文本形式存储原始位。在返回的路上 longBitsToDouble

double x = Math.PI;
String repr = String.format("%016x", Double.doubleToRawLongBits(x));
x = Double.longBitsToDouble(Long.valueOf(repr, 16));

关于java - 如何以全精度输出本地化的 Java 浮点值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25986568/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com