黄金比例计算java_关于java:BigDecimal和两位数限制?

我正在制作一个phi(黄金比例)计算器,但是我对得到的答案的精度有疑问。

我意识到似乎可以回答的位数是固定的,然后它会被截断。起初,我认为这是双打的问题,所以我改用BigDecimals。但是问题仍然存在。

这是我最初的双重逻辑:

public static final double PHI = 1.6180339887498948482045;

b = Double.parseDouble(field.getText());

a = b * PHI;

aPlusB = a + b;

System.out.println(a.toString());

这是我的BigDecimal逻辑的代码:

public static final double PHI = 1.6180339887498948482045;

BigDecimal phi = new BigDecimal(calculationHolder.PHI);

MathContext context = new MathContext(15, RoundingMode.HALF_UP);

BigDecimal a = new BigDecimal(BigInteger.ZERO);

BigDecimal b = new BigDecimal(BigInteger.ZERO);

BigDecimal aPlusB = new BigDecimal(BigInteger.ZERO);

b = new BigDecimal(field.getText());

a = b.multiply(phi, context);

aPlusB = a.add(b, context);

System.out.println(a.toString());

现在,如果我要使b = 1:

我的双重逻辑将返回1.618033988749895(比实际值短许多位)。

如果我使用BigDecimal逻辑,它将返回1.61803398874989(甚至更低的精度)

如果我对b使用非常大的数字(例如123456789123456),

我的双重逻辑将返回199757280943680.16,而BigDecimal逻辑将返回199757280943680(精度甚至更低,甚至没有小数)。

我对此行为感到困惑。似乎,如果有的话,BigDecimal逻辑给了我更不精确的答案,我也不知道为什么。

有人能对此有所启发吗?

您在此处指定了15个精度的十进制数字:

new MathContext(15, RoundingMode.HALF_UP);

您在这里获得了15个精度的十进制数字:

1.61803398874989

您得到的正是您想要的。 您了解第一个构造函数参数的作用吗?

那不是14位小数吗? 还是从小数点开始计数? 即使是这样,为什么BigDecimal会停止使用较大数量的输入来提供该精度?

还是用十进制数字表示,文档一般是指数字? 我的印象是它们的意思是小数位。 我的坏,我会测试一下。

@MainManAndy:您可能应该详细了解小数位数(小数位数-或多或少的小数点右边的位数)和精度(总位数-小数位数)之间的差异,因为BigDecimal不支持任何 除0..9以外的其他数字)。

@MainManAndy:199757280943680也是15位数字。 您指定了不要超过15位的数字,所以您所得到的就是这个数字。

它表示有效数字,即所有数字。 它与小数位不同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值