2017-08-02 48 views
0

我在蒙戈一些文件具有双打作为各自领域中的一种:的Java蒙戈驱动转换双打科学记数法上阅读

{ 
"_id" : "1b1a39a7-5a04-4a0c-9a9e-658b5c95b58d", 
"content" : 
    { 
     "NumTaux" : 0.00196713814946994, 
     "SourceYear" : NumberInt(2017), 
     "Year" : NumberInt(2020), 
     "Age" : NumberInt(-1), 
     "Sex" : "F" 
    } 
} 

Studio 3T view

我用蒙戈Java驱动程序写入并从我们的Mongo读取。 当我阅读这些文件,双打有时转化为科学记数法:

enter image description here

我试着写双打定制编解码器解决这个:

public class DoubleCodec implements Codec<Double> { 
@Override 
public Double decode(BsonReader reader, DecoderContext decoderContext) { 
    return reader.readDouble(); 
} 

@Override 
public void encode(BsonWriter writer, Double value, EncoderContext encoderContext) { 
    writer.writeDouble(value); 
} 

@Override 
public Class<Double> getEncoderClass() { 
    return Double.class; 
} 
} 

并将其添加到我的收集的注册表:

DoubleCodec doubleCodec = new DoubleCodec(); 
    CodecRegistry registry = CodecRegistries.fromRegistries(MongoClient.getDefaultCodecRegistry(), 
                  CodecRegistries.fromCodecs(doubleCodec)); 
    matrixDataCollection = MongoFactory.obtainSyncClient(config) 
             .getDatabase(config.getString(MONGO_DB)) 
             .getCollection(MATRIX_DATA_COLLECTION) 
             .withCodecRegistry(registry); 

但是,这似乎并不奏效,编解码器中的解码方法是从来没有叫我尽可能地看到(断点/系统输出) 我怀疑已经存在的Double编解码器被调用。

有什么办法可以让我自己的DoubleCodec被调用而不是默认的,或者有另外一种方法来配置默认双编解码器的行为方式吗?

+0

是不是只是一个'双的toString()'方法的输出? – Veeram

+0

不这么认为: 调试器显示一个字符串表示形式,但总是可以展开值字段以查看实际值(对于实际字符串,例如显示底层CharSequence)。 当我查看Bson文档中双精度的真实值时,它显示了一些0.0019671381496994和其他的原始值,其他值为5.58600702289802E-4 – Infiniteh

回答

0

当您显示双打时,双打被转换,而不是从数据库中读取。

在这种情况下,您所看到的是调试器在某个未公开的断点处可以做到的地方。

+0

调试屏幕截图中的文档是由mongo驱动程序返回的文档,所以它确实看起来像转换发生在那里。此文档也会转换为csv,然后作为HTTP响应的一部分返回。在csv中,它也被存储为科学记数法。感谢您的回答,但无所谓发生在哪里,我不希望它发生...... – Infiniteh

0

它与MongoDB驱动程序或编解码器无关。这是双重Java的工作原理。 Double.toString()使用FloatingDecimal.toJavaFormatString(d)函数来实现IEEE-754标准。因此,导出的CSV文件中,你需要指定的格式和转换的双重,例如像这样(从https://stackoverflow.com/a/25307973/7717350):

double val = 0.00005196713814946994d; 

DecimalFormat df = new DecimalFormat("0"); 
df.setMaximumFractionDigits(340); 

System.out.println(df.format(myValue)); //output: 0.00005196713814946994 

你可以找到双格式here更多的相关信息。

参考文献: