划分两个大长度,同时保持精度和准确性

时间:2014-03-07 19:59:59

标签: java floating-point long-integer precision division

我有两个较大的long值,例如long a = 106951484895long b = 47666297253。我想一个接一个地分开,同时仍保持精确度和准确性。 a / b仅提供2,这既不准确也不准确。 (double)a / b返回2.243754834308401这是准确的,但我不知道它是否准确。它是准确的,还是有更好的方法?

2 个答案:

答案 0 :(得分:1)

在Java中有一个BigInteger类,用于在使用整数时需要无限精度的情况。对于十进制数字,请使用BigDecimal

Wolfram Alpha会给你2.243754834308400900535121747859167616725725368773485418854923...,我们的数字为2.243754834308401,与

相同
bigDecimal1.divide(bigDecimal2, MathContext.DECIMAL64)

如果你要去

bigDecimal1.divide(bigDecimal2, new MathContext(1000, RoundingMode.HALF_EVEN)))

你会得到

2.24375483430840090053512174785916761672572536877348541885492361677904883097801043287594504
1050407263946829396490609763285697017511527160785819555506643456210143732768535294645618694
7909645722613183738163350810420038396599808994188248448801742297144651257940243013656347535
1346061895880989881427322957327423437070470786123178209350642720039431463073874604572487035
0881416301899886949878414127297558394219666911873273296141755170873372894249298571586701215
5058865276866526572281643300564007415077913939597358974242706109866167162174559269200972437
4468185209762552814414640557312348785977139301334520631262090283427956618755742143233766150
5750523038219597199472866720344664485953248792408356275728443143815091921547456137582778817
3173376404446432448382818379181981559569409501831858179303080342832602945081961262782040747
0742627855109348071601512026092932232568603874560325500767085983329631127368742840999544420
8119473080650114494849915293461361824567061678496514955637978679644265088391509259402889160

为了获得更高的准确性,您可以不断提高MathContext构造函数中的精度。

RoundingMode.HALF_EVEN又名银行家的舍入类似于Java中用于浮点运算和双精度运算的舍入策略。

答案 1 :(得分:1)

如果您check the calculation in Wolfram Alpha,您会看到确切的结果是
2.2437548343084009 00535121747859167616725725368773485418854923 ...你的图 2.243754834308401 已经死了。除非您需要更高的精度,否则double s的计算就足够了。