Mik*_*len 6 java double scala messageformat
如果我使用该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的类型,它等效于Object在爪哇),那么结果是具有截短的精度的本地化字符串:
3.142
即使我在格式字符串中添加了更多提示,结果也是一样的:
java.text.MessageFormat.format ("{0,number}", Math.PI.asInstanceOf[AnyRef])
通过指定自定义格式,我可以获得完整的精度:
java.text.MessageFormat.format ("{0,number,#.###############}", Math.PI.asInstanceOf[AnyRef])
但这需要一些关于双倍大小和精度的知识.如果我打印任何双值(不仅仅是Pi),并且想要保留值的完整精度,那么这种方法意味着我必须动态地更改格式字符串 - 如果(在我的情况下)这不是很方便)格式字符串实际上是从资源包中获取的.
例如,考虑一个double值1.0e37.首先转换为字符串并使用"{0}"作为格式字符串,从而产生适当但未本地化的字符串值1.0E37.如果我把它作为Double带有格式字符串"{0,number}" 的盒子传递给我,那么我得到了荒谬的价值10,000,000,000,000,000,000,000,000,000,000,000,000.
简而言之,我似乎无法找到一个格式字符串来保留双精度的完整精度而不先将其转换为字符串 - 而这是我宁愿像瘟疫一样避免的东西.是否有一个数字格式字符串,可以输出double的完整精度作为本地化值?
更新:
只是为了澄清为什么我不想将双精度转换为字符串:
toString就我能说的而言,返回一个有效的Java双字面值.作为字符串,传递给结果时不会本地化MessageFormat.format.例如,假设我想输出值的本地化形式1234.567.toString会回来的"1234.567",MessageFormat.format会留下来的.精细.我有我的精确输出.然而,在德国,如果出现这种情况,这将更有意义"1.234,567".即使在美国/英国,如果出现这种情况,这看起来会更好"1,234.567".Integer,Boolean或任何其他非浮点基元类型传递给MessageFormat.format(使用简单的"{ n }"格式),那么我可以获得很好的本地化,全精度输出.我不需要 - 也不应该,因为我将丢失本地化输出 - 首先将这些值转换为字符串.这意味着我必须以不同方式处理双精度(和浮点数和BigDecimals)并在传递之前将它们转换为字符串MessageFormat.format.(而且,我必须记住每次都这样做.)Aiv*_*ean -1
Java中的Double格式用64位表示,52位用于尾数。日志(2 52)= 15.65355977。这意味着Double的精度大约是15-16位。
所以我认为结果3.141592653589793几乎就是你能从 Double 得到的一切。