- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
如果我使用 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])
(AnyRef
是Scala类型,相当于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"
也会更好看。Integer
、Boolean
或任何其他非浮点基本类型传递给 MessageFormat.format
(使用简单的“{n}"格式),然后我得到很好的本地化、全精度输出。我不需要——也不应该,因为我会丢失本地化输出——首先将这些值转换为字符串。这意味着我必须以不同的方式对待 double (以及 float 和 BigDecimal
)并将它们转换为字符串,然后再将它们传递给 MessageFormat.format
。 (此外,我必须记住每次都这样做。)最佳答案
MessageFormat 使用本地化表示,带有千位分隔符,可能是十进制逗号等。在您的使用中,它使用您平台的默认语言环境。
一些应该与通用程序员的符号 valueOf/toString 分开的东西。
使用 double
和 precision
有点矛盾,因为十进制表示是 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/
我是一名优秀的程序员,十分优秀!