2017-08-02 50 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更多的相關信息。

參考文獻: