区分BigDecimal的toString()和toPlainString()

求值语句

为了能表示出科学计数法,我们得让数小一点:

BigDecimal num = new BigDecimal(0.2333).pow(20);

打印结果

System.out.println(num);
2.28189037167401120969664016458058704445821447776153697856333722521431496331550551213930891906957487435112104808347862419891420033162248142531663995155772279146232315410060206987151178648426698855546081020777110688844170619669193518453985280966919855312604013430815833563803446476005419063873594466971526322215177750276141448913214334808975521236293623113834028980688572444044246581431849340824046219938314943100698334559217720778436613420267026603092024290999790614071820410967350767900092513471798538644190754888725556844272602124114705649986642100894001740207945946131697703242257894368252834211931168108684805772879141748782976829469911671275574176661389794305239001858006008883235021362729155223312931934657673225453759580180785170264139962848926240405883081486320326522336957649286875366094925648693739077878530704550560566747517994737139860236090744552245807066682260105331670524231711427517062910685789869039060383532495613756103646363461215507160773269224241213935868860166499926337883991102182710785104859748632046196649414415702494807192124426364898681640625E-13

toString()打印结果

结果是一样的,因为我们其实也知道在打印num的时候其实默认就是打印num.toString()啦!

System.out.println(num.toString());
2.28189037167401120969664016458058704445821447776153697856333722521431496331550551213930891906957487435112104808347862419891420033162248142531663995155772279146232315410060206987151178648426698855546081020777110688844170619669193518453985280966919855312604013430815833563803446476005419063873594466971526322215177750276141448913214334808975521236293623113834028980688572444044246581431849340824046219938314943100698334559217720778436613420267026603092024290999790614071820410967350767900092513471798538644190754888725556844272602124114705649986642100894001740207945946131697703242257894368252834211931168108684805772879141748782976829469911671275574176661389794305239001858006008883235021362729155223312931934657673225453759580180785170264139962848926240405883081486320326522336957649286875366094925648693739077878530704550560566747517994737139860236090744552245807066682260105331670524231711427517062910685789869039060383532495613756103646363461215507160773269224241213935868860166499926337883991102182710785104859748632046196649414415702494807192124426364898681640625E-13

toPlainString()打印结果

这次,可有点不同啦!

System.out.println(num.toPlainString());
0.000000000000228189037167401120969664016458058704445821447776153697856333722521431496331550551213930891906957487435112104808347862419891420033162248142531663995155772279146232315410060206987151178648426698855546081020777110688844170619669193518453985280966919855312604013430815833563803446476005419063873594466971526322215177750276141448913214334808975521236293623113834028980688572444044246581431849340824046219938314943100698334559217720778436613420267026603092024290999790614071820410967350767900092513471798538644190754888725556844272602124114705649986642100894001740207945946131697703242257894368252834211931168108684805772879141748782976829469911671275574176661389794305239001858006008883235021362729155223312931934657673225453759580180785170264139962848926240405883081486320326522336957649286875366094925648693739077878530704550560566747517994737139860236090744552245807066682260105331670524231711427517062910685789869039060383532495613756103646363461215507160773269224241213935868860166499926337883991102182710785104859748632046196649414415702494807192124426364898681640625

总结

对于一个数值可能很小的BigDecimal对象来说,使用toString()可能由于打印的数值太小而打印其科学计数法表示,而使用toPlainString()才能打印完整的数值。

完整代码

import java.math.BigDecimal;

public class BigDecimalTest {
    public static void main(String[] args) {
        BigDecimal num = new BigDecimal(0.2333).pow(20);
        System.out.println(num);
        System.out.println(num.toString());
        System.out.println(num.toPlainString());
    }
}

说明

例子的结果不能不够小,否则可能误认为三者一样。

比如最早我测的是这个:

import java.math.BigDecimal;

public class BigDecimalTest {
    public static void main(String[] args) {
        BigDecimal num = new BigDecimal(0.66).pow(10);
        System.out.println(num);
        System.out.println(num.toString());
        System.out.println(num.toPlainString());
    }
}

但结果很悲催:

>java BigDecimalTest
0.01568336880910796514692485387380358722432090658674607795185185558463356941593280438333875994123155412243735195834705140991618787447848128774946858219534786702323782812590762928242630260751971484116602400344065713771468254349752623195976497313013575753886310637762485552492886146251661530527797289372428420293315321412564193962492477328625977419079453856979274761289232833572242408303626740680597755011834774326410628545344183904639899408459342093849694664301730220414247643012754939939265054482664396573454723693430423736572265625
0.01568336880910796514692485387380358722432090658674607795185185558463356941593280438333875994123155412243735195834705140991618787447848128774946858219534786702323782812590762928242630260751971484116602400344065713771468254349752623195976497313013575753886310637762485552492886146251661530527797289372428420293315321412564193962492477328625977419079453856979274761289232833572242408303626740680597755011834774326410628545344183904639899408459342093849694664301730220414247643012754939939265054482664396573454723693430423736572265625
0.01568336880910796514692485387380358722432090658674607795185185558463356941593280438333875994123155412243735195834705140991618787447848128774946858219534786702323782812590762928242630260751971484116602400344065713771468254349752623195976497313013575753886310637762485552492886146251661530527797289372428420293315321412564193962492477328625977419079453856979274761289232833572242408303626740680597755011834774326410628545344183904639899408459342093849694664301730220414247643012754939939265054482664396573454723693430423736572265625

这很容易令人迷惑哒~

发布了645 篇原创文章 · 获赞 1334 · 访问量 57万+

猜你喜欢

转载自blog.csdn.net/weixin_43896318/article/details/104630775
今日推荐