Java 在保持精度和准确性的情况下划分两个大长度

Java 在保持精度和准确性的情况下划分两个大长度,java,floating-point,long-integer,precision,division,Java,Floating Point,Long Integer,Precision,Division,我有两个大的long值,例如long a=106951484895和long b=47666297253。我想用一个除以另一个,同时保持精确性和准确性a/b只给出2,既不精确也不准确(双精度)a/b返回2.243754834308401这是精确的,但我不知道是否准确。它是精确的,还是有更好的方法?在Java中有一个biginger类,用于在需要使用整数的无限精度时使用。对于十进制数,请使用BigDecimal Wolfram Alpha将为您提供2.24375483430840090053512

我有两个大的
long
值,例如
long a=106951484895
long b=47666297253
。我想用一个除以另一个,同时保持精确性和准确性<代码>a/b只给出
2
,既不精确也不准确
(双精度)a/b
返回
2.243754834308401
这是精确的,但我不知道是否准确。它是精确的,还是有更好的方法?

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

Wolfram Alpha将为您提供
2.24375483430840090053512174759167616725725368773485418854923…
,我们的数字是
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
aka Banker's rounding类似于Java中用于浮点和双精度算术的舍入策略

如果您愿意,您将看到确切的结果是
2.243754834308400900535121747859167616725725368773485418854923... 你的身材

2.243754834308401完全打开。除非您需要更高的精度,否则使用
double
s进行计算就足够了。

BigDecimal会响吗?@Hannes是的,但我不知道它是否更精确。至少它避免了IEEE 754舍入误差的常见问题。您的数字精确到所有显示的数字。你需要更精确吗?哈。。即使是
BigDecimal
也无法给出该除法的精确表示值。哈哈:)你是怎么想到这些价值观的?