我想用java类BigDecimal
计算,但我总是通过周期数得到异常。我一直在网上寻找,但不幸的是什么也没找到。也许有人能帮我修复它。
例子:
System.out.println(new BigDecimal(1).divide(new BigDecimal(3)));
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide(Unknown Source)
at Berechne.rechne(Berechne.java:16)
at Berechne.main(Berechne.java:39)
系统出来println(新的BigDecimal(1)。除法(新的BigDecimal(4))--
BigDecimal
不支持不能写入固定长度小数的数字。1/3就是一个很好的例子。像sqrt(2)或PI这样的无理数是另一种类型。
您需要提供您想要的精确度和四舍五入。
您正在尝试将1
除以3
,小数点后会出现循环数。维基百科是这么说的:
在算术中,重复十进制是一种表示有理数的方法。因此,如果一个数字的十进制表示形式在某个点上变得周期性,也就是说,如果某个有限的数字序列无限期地重复,则称为重复十进制(或循环十进制)。例如,1/3=0.3333333…或0.3(称为“0.3重复”,或“0.3重复”)的十进制表示形式在小数点之后变得周期性,无限重复单位数序列“3”。
您没有指定精度和四舍五入模式。BigDecimal抱怨说它可以使用无穷大的小数位,但它仍然不能给你一个确切的数字表示。
查看文档:
当MathContext对象的精度设置为0(例如,MathContext. UNLIMITED)时,算术操作是精确的,不使用MathContexthtml" target="_blank">对象的算术方法也是如此。(这是5之前版本中唯一支持的行为。)
作为计算精确结果的必然结果,不使用精度设置为0的MathContext对象的舍入模式设置,因此不相关。在除法的情况下,精确的整数可以有无限长的十进制展开式;例如,1除以3。
如果商具有非终止十进制扩展,并且指定该操作以返回精确结果,则会引发算术异常。否则,将返回除法的确切结果,就像其他操作一样。
为了避免这种情况,可以使用divide(BigDecimal除数、int scale、int roundingMode)
在我的代码中 当我运行程序时,它抛出一个数字格式异常 我做错了什么?这似乎相对简单,但不起作用。
这个BigDecimalSorting的问题是什么?代码将数字作为字符串,然后将其转换为BigDecimal,然后排序并打印排序后的BigDecimals。 样本输入:9 -100 50 0 56.6 90 0.12 .12 02.34 000.000 预期产量:9056.6502.340.12.12000.000-100
这是一个考题,我想一定有更有效的方法。(我也知道有一种方法可以直接转换二进制数,而不需要经过二进制字符串,但我不知道如何转换)。 这就是问题所在: 给出了一个由Q字符组成的非空零索引字符串S。该字符串的周期是最小的正整数P,使得: P≤ Q/2和S[K]=S[kp]表示0≤ K 例如,8是“Codilityco”的时期。如果M是N的二进制表示的周期,则正整数M是正整数N的二进制周期。 例如,4是9
主要内容:二进制数、八进制数和十六进制数的表示,二进制数、八进制数和十六进制数的输出C语言中的整数除了可以使用十进制,还可以使用二进制、八进制和十六进制。 二进制数、八进制数和十六进制数的表示 一个数字默认就是十进制的,表示一个十进制数字不需要任何特殊的格式。但是,表示一个二进制、八进制或者十六进制数字就不一样了,为了和十进制数字区分开来,必须采用某种特殊的写法,具体来说,就是在数字前面加上特定的字符,也就是加前缀。 1) 二进制 二进制由 0 和 1 两个数字组成,使用时必须以
我想设置两个BigDecimal数字和的比例。如本例所示: 当我运行时,我有一个例外: 为什么四舍五入是必要的?如果我不想让周围,什么是解决方案? 谢谢
所以我正在做一个脚本,把两个数字(十进制数字)加在一起,这我遇到了一个问题。 http://jsfidle.net/derekl/esqnc/ 我做的剧本,结果很好: 但很快我就明白了: