繁体   English   中英

Java BigDecimal错误?

[英]Java BigDecimal error?

解决了:

**刚从Oracle收到一封电子邮件,他们在JDK版本8u40中解决了此问题。 我从未收到他们的通知。 因此,这个问题尚无定论。


我以前曾发布过此问题( 有人知道这是否是Java库错误吗? ),但是没有简洁的测试程序。 现在我知道了。 有人可以查看我是否忽略了代码中的某些内容,还是运行了它并验证了它是否在我的环境中?

下面是代码和输出。 最后4行显示了该问题。 我怀疑不是重要的PI值,而是具有1515小数位的事实。 注意,如果使用行设置SCALE = 1000小数位而不是1500,则对于pi * 10 ^ 595,程序将在最后产生正确的结果。 顺便说一句,我知道带有toString()的最后一行是多余的; 它是更大测试的一部分,并且是残余。

import java.math.BigDecimal;
import java.math.BigInteger;

public class testBigDecimal
{
  public  static  void    main(String args[])
  {
    new testBigDecimal().test();
  }

  private void    test()
  {
    BigDecimal  PI;
    BigDecimal  TWO_PI;

//      int SCALE = 1000;       // xxxxxxx  THIS WORKS
        int SCALE = 1500;       // xxxxxxx  THIS FAILS

    PI = new BigDecimal("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132000568127145263560827785771342757789609173637178721468440901224953430146549585371050792279689258923542019956112129021960864034418159813629774771309960518707211349999998372978049951059731732816096318595024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303598253490428755468731159562863882353787593751957781857780532171226806613001927876611195909216420198938095257201065485863278865936153381827968230301952035301852968995773622599413891249721775283479131515574857242454150695950829533116861727855889075098381754637464939319255060400927701671139009848824012858361603563707660104710181942955596198946767837449448255379774726847104047534646208046684259069491293313677028989152104752162056966024058038150193511253382430035587640247496473263914199272604269922796782354781636009341721641219924586315030286182974555706749838505494588586926995690927210797509302952311877082277576");
    TWO_PI = PI.multiply( new BigDecimal("2") ) .setScale(SCALE,BigDecimal.ROUND_DOWN);

    System.out.println("\r\n TWO_PI = " + TWO_PI);

    // -------------------------------------------
    // first try -- CORRECT RESULT for movePointRight()

    BigDecimal x = TWO_PI;

    int places = 70;
    BigInteger ix = x.movePointRight(places).toBigInteger();
    System.out.println("\r\n         places = " + places);
    System.out.println(    "           x = TWO_PI = " + x);
    System.out.println(    " right(places).int( ) = " + ix);
    System.out.println("");

    BigDecimal shiftX = x.movePointRight(places);
    String sx = x.movePointRight(places).toString();
    System.out.println("  x.movePointRight(x) = " + shiftX);
    System.out.println("     String for above = " + sx);


    // -------------------------------------------
    // second try -- INCORRECT RESULT for movePointRight()

    System.out.println("\r\n-------------------------------------------");
    System.out.println("\r\n TWO_PI = " + TWO_PI);

    x = TWO_PI;

    places = 595;
    ix = x.movePointRight(places).toBigInteger();
    System.out.println("\r\n         places = " + places);
    System.out.println(    "           x = TWO_PI = " + x);
    System.out.println(    " right(places).int( ) = " + ix);
    System.out.println("");

    // wrong:
    shiftX = x.movePointRight(places);
    sx = x.movePointRight(places).toString();
    System.out.println("  x.movePointRight(x) = " + shiftX);
    System.out.println("     String for above = " + sx);
  }
}

输出:

TWO_PI = 6.283185307179586476925286766559005768394338798750211641949889184615632812572417997256069650684234135964296173026564613294187689219101164463450718816256962234900568205403877042211119289245897909860763928857621951331866892256951296467573566330542403818291297133846920697220908653296426787214520498282547449174013212631176349763041841925658508183430728735785180720022661061097640933042768293903883023218866114540731519183906184372234763865223586210237096148924759925499134703771505449782455876366023898259667346724881313286172042789892790449474381404359721887405541078434352586353504769349636935338810264001136254290527121655571542685515579218347274357442936881802449906860293099170742101584559378517847084039912224258043921728068836319627259549542619921037414422699999996745956099902119463465632192637190048918910693816605285044616506689370070523862376342020006275677505773175066416762841234355338294607196506980857510937462319125727764707575187503915563715561064342453613226003855753222391818432840397876190514402130971726557731872306763655936460603904070603705937991547245198827782499443550566958263031149714484908301391901659066233723455711778150196763509274929878638510120801855403342278019697648025716723207127415320209420363885911192397893535674898896510759549453694208095069292416093368518138982586627354057978304209504324113932048116076300387022506764860071175280494992946527828398545208539845593564709563272018683443282439849172630060572365949111413499677010989177173853991381854421595018605904

places = 70
x = TWO_PI = 6.283185307179586476925286766559005768394338798750211641949889184615632812572417997256069650684234135964296173026564613294187689219101164463450718816256962234900568205403877042211119289245897909860763928857621951331866892256951296467573566330542403818291297133846920697220908653296426787214520498282547449174013212631176349763041841925658508183430728735785180720022661061097640933042768293903883023218866114540731519183906184372234763865223586210237096148924759925499134703771505449782455876366023898259667346724881313286172042789892790449474381404359721887405541078434352586353504769349636935338810264001136254290527121655571542685515579218347274357442936881802449906860293099170742101584559378517847084039912224258043921728068836319627259549542619921037414422699999996745956099902119463465632192637190048918910693816605285044616506689370070523862376342020006275677505773175066416762841234355338294607196506980857510937462319125727764707575187503915563715561064342453613226003855753222391818432840397876190514402130971726557731872306763655936460603904070603705937991547245198827782499443550566958263031149714484908301391901659066233723455711778150196763509274929878638510120801855403342278019697648025716723207127415320209420363885911192397893535674898896510759549453694208095069292416093368518138982586627354057978304209504324113932048116076300387022506764860071175280494992946527828398545208539845593564709563272018683443282439849172630060572365949111413499677010989177173853991381854421595018605904
right(places).int( ) = 62831853071795864769252867665590057683943387987502116419498891846156328

x.movePointRight(x) = 62831853071795864769252867665590057683943387987502116419498891846156328.12572417997256069650684234135964296173026564613294187689219101164463450718816256962234900568205403877042211119289245897909860763928857621951331866892256951296467573566330542403818291297133846920697220908653296426787214520498282547449174013212631176349763041841925658508183430728735785180720022661061097640933042768293903883023218866114540731519183906184372234763865223586210237096148924759925499134703771505449782455876366023898259667346724881313286172042789892790449474381404359721887405541078434352586353504769349636935338810264001136254290527121655571542685515579218347274357442936881802449906860293099170742101584559378517847084039912224258043921728068836319627259549542619921037414422699999996745956099902119463465632192637190048918910693816605285044616506689370070523862376342020006275677505773175066416762841234355338294607196506980857510937462319125727764707575187503915563715561064342453613226003855753222391818432840397876190514402130971726557731872306763655936460603904070603705937991547245198827782499443550566958263031149714484908301391901659066233723455711778150196763509274929878638510120801855403342278019697648025716723207127415320209420363885911192397893535674898896510759549453694208095069292416093368518138982586627354057978304209504324113932048116076300387022506764860071175280494992946527828398545208539845593564709563272018683443282439849172630060572365949111413499677010989177173853991381854421595018605904
String for above = 62831853071795864769252867665590057683943387987502116419498891846156328.12572417997256069650684234135964296173026564613294187689219101164463450718816256962234900568205403877042211119289245897909860763928857621951331866892256951296467573566330542403818291297133846920697220908653296426787214520498282547449174013212631176349763041841925658508183430728735785180720022661061097640933042768293903883023218866114540731519183906184372234763865223586210237096148924759925499134703771505449782455876366023898259667346724881313286172042789892790449474381404359721887405541078434352586353504769349636935338810264001136254290527121655571542685515579218347274357442936881802449906860293099170742101584559378517847084039912224258043921728068836319627259549542619921037414422699999996745956099902119463465632192637190048918910693816605285044616506689370070523862376342020006275677505773175066416762841234355338294607196506980857510937462319125727764707575187503915563715561064342453613226003855753222391818432840397876190514402130971726557731872306763655936460603904070603705937991547245198827782499443550566958263031149714484908301391901659066233723455711778150196763509274929878638510120801855403342278019697648025716723207127415320209420363885911192397893535674898896510759549453694208095069292416093368518138982586627354057978304209504324113932048116076300387022506764860071175280494992946527828398545208539845593564709563272018683443282439849172630060572365949111413499677010989177173853991381854421595018605904

-------------------------------------------

TWO_PI = 6.283185307179586476925286766559005768394338798750211641949889184615632812572417997256069650684234135964296173026564613294187689219101164463450718816256962234900568205403877042211119289245897909860763928857621951331866892256951296467573566330542403818291297133846920697220908653296426787214520498282547449174013212631176349763041841925658508183430728735785180720022661061097640933042768293903883023218866114540731519183906184372234763865223586210237096148924759925499134703771505449782455876366023898259667346724881313286172042789892790449474381404359721887405541078434352586353504769349636935338810264001136254290527121655571542685515579218347274357442936881802449906860293099170742101584559378517847084039912224258043921728068836319627259549542619921037414422699999996745956099902119463465632192637190048918910693816605285044616506689370070523862376342020006275677505773175066416762841234355338294607196506980857510937462319125727764707575187503915563715561064342453613226003855753222391818432840397876190514402130971726557731872306763655936460603904070603705937991547245198827782499443550566958263031149714484908301391901659066233723455711778150196763509274929878638510120801855403342278019697648025716723207127415320209420363885911192397893535674898896510759549453694208095069292416093368518138982586627354057978304209504324113932048116076300387022506764860071175280494992946527828398545208539845593564709563272018683443282439849172630060572365949111413499677010989177173853991381854421595018605904

places = 595
x = TWO_PI = 6.283185307179586476925286766559005768394338798750211641949889184615632812572417997256069650684234135964296173026564613294187689219101164463450718816256962234900568205403877042211119289245897909860763928857621951331866892256951296467573566330542403818291297133846920697220908653296426787214520498282547449174013212631176349763041841925658508183430728735785180720022661061097640933042768293903883023218866114540731519183906184372234763865223586210237096148924759925499134703771505449782455876366023898259667346724881313286172042789892790449474381404359721887405541078434352586353504769349636935338810264001136254290527121655571542685515579218347274357442936881802449906860293099170742101584559378517847084039912224258043921728068836319627259549542619921037414422699999996745956099902119463465632192637190048918910693816605285044616506689370070523862376342020006275677505773175066416762841234355338294607196506980857510937462319125727764707575187503915563715561064342453613226003855753222391818432840397876190514402130971726557731872306763655936460603904070603705937991547245198827782499443550566958263031149714484908301391901659066233723455711778150196763509274929878638510120801855403342278019697648025716723207127415320209420363885911192397893535674898896510759549453694208095069292416093368518138982586627354057978304209504324113932048116076300387022506764860071175280494992946527828398545208539845593564709563272018683443282439849172630060572365949111413499677010989177173853991381854421595018605904
right(places).int( ) = 62831853071795864769252867665590057683943387987502116419498891846156328125724179972560696506842341359642961730265646132941876892191011644634507188162569622349005682054038770422111192892458979098607639288576219513318668922569512964675735663305424038182912971338469206972209086532964267872145204982825474491740132126311763497630418419256585081834307287357851807200226610610976409330427682939038830232188661145407315191839061843722347638652235862102370961489247599254991347037715054497824558763660238982596673467248813132861720427898927904494743814043597218874055410784343525863535047693496369353388

x.movePointRight(x) = 125663706143591729538505735331180115367886775975004232838997783692312656251448359945121393013684682719285923460531292265883753784382023289269014376325139244698011364108077540844222385784917958197215278577152439026637337845139025929351471326610848076365825942676938413944418173065928535744290409965650948983480264252623526995260836838513170163668614574715703614400453221221952818660855365878077660464377322290814630383678123687444695277304471724204741922978495198509982694075430108995649117527320477965193346934497626265723440855797855808989487628087194437748110821568687051727070095386992738706776.20528002272508581054243311143085371031158436694548714885873763604899813720586198341484203169118757035694168079824448516087843456137672639254519099085239842074828845399999993491912199804238926931264385274380097837821387633210570089233013378740141047724752684040012551355011546350132833525682468710676589214393013961715021874924638251455529415150375007831127431122128684907226452007711506444783636865680795752381028804261943453115463744613527311872921207808141207411875983094490397655564998887101133916526062299428969816602783803318132467446911423556300393527018549859757277020241603710806684556039395296051433446414254830640418840727771822384795787071349797793021519098907388416190138584832186737036277965173254708115956608419008648227864096232152600774045013529720142350560989985893055656797090417079691187129419126544037366886564879698345260121144731898222826999354021978354347707982763708843190037211808
String for above = 125663706143591729538505735331180115367886775975004232838997783692312656251448359945121393013684682719285923460531292265883753784382023289269014376325139244698011364108077540844222385784917958197215278577152439026637337845139025929351471326610848076365825942676938413944418173065928535744290409965650948983480264252623526995260836838513170163668614574715703614400453221221952818660855365878077660464377322290814630383678123687444695277304471724204741922978495198509982694075430108995649117527320477965193346934497626265723440855797855808989487628087194437748110821568687051727070095386992738706776.20528002272508581054243311143085371031158436694548714885873763604899813720586198341484203169118757035694168079824448516087843456137672639254519099085239842074828845399999993491912199804238926931264385274380097837821387633210570089233013378740141047724752684040012551355011546350132833525682468710676589214393013961715021874924638251455529415150375007831127431122128684907226452007711506444783636865680795752381028804261943453115463744613527311872921207808141207411875983094490397655564998887101133916526062299428969816602783803318132467446911423556300393527018549859757277020241603710806684556039395296051433446414254830640418840727771822384795787071349797793021519098907388416190138584832186737036277965173254708115956608419008648227864096232152600774045013529720142350560989985893055656797090417079691187129419126544037366886564879698345260121144731898222826999354021978354347707982763708843190037211808

使用值SCALE = 1000时,它们是最后2条输出行:

x.movePointRight(x) = 62831853071795864769252867665590057683943387987502116419498891846156328125724179972560696506842341359642961730265646132941876892191011644634507188162569622349005682054038770422111192892458979098607639288576219513318668922569512964675735663305424038182912971338469206972209086532964267872145204982825474491740132126311763497630418419256585081834307287357851807200226610610976409330427682939038830232188661145407315191839061843722347638652235862102370961489247599254991347037715054497824558763660238982596673467248813132861720427898927904494743814043597218874055410784343525863535047693496369353388.102640011362542905271216555715426855155792183472743574429368818024499068602930991707421015845593785178470840399122242580439217280688363196272595495426199210374144226999999967459560999021194634656321926371900489189106938166052850446165066893700705238623763420200062756775057731750664167628412343553382946071965069808575109374623191257277647075751875039155637155610643424536132260038557532223918184328403978
String for above = 62831853071795864769252867665590057683943387987502116419498891846156328125724179972560696506842341359642961730265646132941876892191011644634507188162569622349005682054038770422111192892458979098607639288576219513318668922569512964675735663305424038182912971338469206972209086532964267872145204982825474491740132126311763497630418419256585081834307287357851807200226610610976409330427682939038830232188661145407315191839061843722347638652235862102370961489247599254991347037715054497824558763660238982596673467248813132861720427898927904494743814043597218874055410784343525863535047693496369353388.102640011362542905271216555715426855155792183472743574429368818024499068602930991707421015845593785178470840399122242580439217280688363196272595495426199210374144226999999967459560999021194634656321926371900489189106938166052850446165066893700705238623763420200062756775057731750664167628412343553382946071965069808575109374623191257277647075751875039155637155610643424536132260038557532223918184328403978

@pbabcdefp fyi,Oracle文档指示内部变量“ tau”未正确缩放。 tau = 2 * pi。 不确定在缩放中使用圆的位置,但是鉴于使用了许多数值方法来提高效率也就不足为奇了。

另外,我发现1415小数位是失败的起点。.我想知道1415是pi的前4个小数位是否没有任何意义。 我还发现(与您一样)对于k的随机值,错误的测试结果始终是正确值的2 ^ k的倍数。

同样,fyi,显然是“ tau”,是有人认为阿基米德将pi设为基本圆常数,而2 * pi应该是错误的。 我个人认为有人认为阿基米德应该预见到欧拉等的结果,并且历史没有正确发生,这很有趣。 但是可以确定,该错误已在JDK 8u45中修复,这是我下载的,并且应该已在8u40中修复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM