Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala以确定的方式双重保存和读取二进制文件_Scala_File_Binary_Double_Precision - Fatal编程技术网

Scala以确定的方式双重保存和读取二进制文件

Scala以确定的方式双重保存和读取二进制文件,scala,file,binary,double,precision,Scala,File,Binary,Double,Precision,如何使Scala将双精度保存到二进制文件并在不损失精度的情况下将其读回 Scala已经有了一个很好的框架,可以将Double保存到文本文件中,并在base 10中编码为字符串表示形式。但是,这样做会引入舍入误差。IEEE 754 64位浮点点到十进制的转换不完美,并且引入了轻微的舍入误差。每两小时“备份”到磁盘,然后从磁盘重新加载并恢复的模拟是不确定的。保持运行的模拟与暂停并从文件恢复的模拟不同。您的想法?要解决这个问题,我认为您应该使用BigDecimal 注意事项 BigDecimal(S

如何使Scala将双精度保存到二进制文件并在不损失精度的情况下将其读回


Scala已经有了一个很好的框架,可以将Double保存到文本文件中,并在base 10中编码为字符串表示形式。但是,这样做会引入舍入误差。IEEE 754 64位浮点点到十进制的转换不完美,并且引入了轻微的舍入误差。每两小时“备份”到磁盘,然后从磁盘重新加载并恢复的模拟是不确定的。保持运行的模拟与暂停并从文件恢复的模拟不同。您的想法?

要解决这个问题,我认为您应该使用
BigDecimal

注意事项
  • BigDecimal(String)
    构造函数应始终优先于
    BigDecimal(Double)
    ,因为使用
    BigDecimal(Double)
    是不可预测的,因为Double无法将0.1表示为精确的0.1

  • 如果必须使用double初始化
    bigdecim
    ,请使用
    bigdecim.valueOf(double)
    ,它使用
    double.toString(double)
    方法将
    double
    值转换为字符串

  • 设置刻度时应提供舍入模式

  • striptrailingzero
    删除所有尾随零

  • toString()
    可以使用科学记数法,但是,
    toPlainString()
    将永远不会在其结果中返回幂运算

请参阅此链接:


您可以按字节顺序以二进制格式保存小数:

val fos: OutputStream = ???
val out = new DataOutputStream(fos)
out.writeDouble(1.0)

按照simpadjo的建议

val sn:List[Double] = List(
          -4.2745321334280,-0.8827640054242,
          0.5781790299989,-2.5173973937094,
          4.3955017758756);
val outputstm:OutputStream = new FileOutputStream( "numbers.bin" )
val dos:DataOutputStream = new DataOutputStream(outputstm)
for( k <- sn ) dos.writeDouble(k)
dos.close()
outputstm.close()
val序列号:列表[双]=列表(
-4.2745321334280,-0.8827640054242,
0.5781790299989,-2.5173973937094,
4.3955017758756);
val outputstm:OutputStream=新文件OutputStream(“numbers.bin”)
val dos:DataOutputStream=新的DataOutputStream(outputstm)

对于(k)你能使用像BigDecimal这样的任意精度格式吗?这是我一直在寻找的数据输出流。我将在底部发布一个示例。感谢你对这个问题的回答。@KseniaSemenova不客气!如果一个答案解决了你的问题,你应该接受并投票表决,而不是以你的名义重写,只需稍作修改。我不是在追求名誉,只是想说明它是如何运作的。