我的mongo中有一些文件可以作为他们的领域之一:
{
"_id" : "1b1a39a7-5a04-4a0c-9a9e-658b5c95b58d",
"content" :
{
"NumTaux" : 0.00196713814946994,
"SourceYear" : NumberInt(2017),
"Year" : NumberInt(2020),
"Age" : NumberInt(-1),
"Sex" : "F"
}
}
我使用mongo java驱动程序写入和读取Mongo。 当我阅读这些文件时,双打有时会转换为科学记数法:
我尝试通过为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被调用而不是默认的,或者有另一种方法来配置默认的双编解码器的行为?
答案 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上找到更多信息。
参考文献: