Java mongo驱动程序在读取时将双精度转换为科学计数法

时间:2017-08-02 13:31:43

标签: java mongodb

我的mongo中有一些文件可以作为他们的领域之一:

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

Studio 3T view

我使用mongo java驱动程序写入和读取Mongo。 当我阅读这些文件时,双打有时会转换为科学记数法:

enter image description here

我尝试通过为Doubles编写自定义编解码器来解决这个问题:

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被调用而不是默认的,或者有另一种方法来配置默认的双编解码器的行为?

2 个答案:

答案 0 :(得分:0)

显示双精度数时会转换双精度数,而不是从数据库中读取双精度数。

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

答案 1 :(得分:0)

它与MongoDB驱动程序或编解码器无关。它是Java的双重工作方式。 Double.toString()在引擎盖下使用FloatingDecimal.toJavaFormatString(d)函数,这是IEEE-754标准的实现。因此在csv导出期间,您需要指定格式并转换double,例如像这样(来自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上找到更多信息。

参考文献: