在Java中将double转换为String,反之亦然,而不会失去准确性

Iai*_*ain 2 java types

字符串一个的表示写入和从由文件读C#应用.

C#应用程序使用以下片段将double转换为字符串:

value.ToString("R", NumberFormatInfo.InvariantInfo);
Run Code Online (Sandbox Code Playgroud)

C#应用程序使用以下片段将字符串转换为double

double num = double.Parse(s, NumberStyles.Float, (IFormatProvider) NumberFormatInfo.InvariantInfo);
Run Code Online (Sandbox Code Playgroud)

如果要将相同的文件写入Java应用程序并从中读取,那么如何在不丢失数据的情况下转换类型?

Jon*_*eet 13

我相信,只是使用Double.parseDouble()并且Double.toString()应该工作而不会丢失数据.特别是,从以下文档Double.toString():

m或a的小数部分必须打印多少位?必须至少有一个数字来表示小数部分,并且除此之外必须有多个,但只需要多少,更多的数字来唯一地区分参数值和double类型的相邻值.也就是说,假设x是由该方法为有限非零参数d生成的十进制表示所表示的精确数学值.那么d必须是最接近x的double值; 或者如果两个double值同样接近x,则d必须是其中之一,d的有效位的最低有效位必须为0.

另一种选择,如果你想保留确切的字符串表示(这不是完全相同的东西)是BigDecimal在Java中使用.

  • Downvoters - 请留下评论,否则downvote没什么用处. (2认同)
  • System.out.println(Math.PI == Double.parseDouble(Double.toString(Math.PI))); //打印"true" (2认同)
  • @ADB:听起来您似乎希望double存储更多信息-double不能“存储”超过15-17个有效数字;就倍数而言,0.00000000000000000000000000000000001d + 100d / 6的值*等于* 100d / 6,因为更“准确”的值将需要比可用位数更多的有效数字。 (2认同)

Miq*_*uel 6

双打精度有限,可能无法完整保留字符串.BigDecimal类具有任意的精确性并保持表示.

要将字符串转换为BigDecimal:

BigDecimal d = new BigDecimal("10.1234567890");
Run Code Online (Sandbox Code Playgroud)

要将BigDecimal转换为字符串:

System.out.println(d.toString());
Run Code Online (Sandbox Code Playgroud)

更多细节:http: //epramono.blogspot.com/2005/01/double-vs-bigdecimal.html


Jee*_*Bee 5

您是否出于任何目的需要字符串表示形式,还是仅用于文本数据传输(例如SOAP / REST消息)?

对于后者,您可以将double值转换为long using java.lang.Double.doubleToRawLongBits(double value),然后再转换为double use java.lang.Double.longBitsToDouble(long value)。您可以将long值作为十六进制编码的字符串进行传输。

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Double.html#doubleToRawLongBits(double) http://java.sun.com/j2se/1.5.0/docs/ api / java / lang / Double.html#longBitsToDouble(long)

这将保留您所拥有的准确的64位double值,但它对于人类来说不是可读的(对于大多数!;))。