下午好,
考虑到我们有两个数字并且我们想要添加它们但没有任何舍入,我们希望得到真正的价值 因此,如果我们添加0,4 + 0,6要么是double,要么浮动java打印结果1但实际上这不是存储在memmory上的实数。 我试图将它们转换为BigDecimal,但它也打印结果1 !! 但是,当数字具有除0.5之外的分数部分时,转换bigDecimal可以正常工作。
这是一个方法的一部分我正在制作一个带有netbeans的科学计算器用户在textArea中给出一个数学表达式.a将表达式作为一个字符串,然后我将它分离给一个对象的值。数学元素元素可以是一个运营商或号码。 我发布的方法部分只有添加
的情况如果用户给出表达式0.6 + 0.4我想找到两个结果并打印它们(结果给出0.4 + 0.6 = 1以及此总和的实际结果)
Stack<MathematicElement> stack = new Stack<MathematicElement>();
BigDecimal pin[]=new BigDecimal[post.length];
BigDecimal b1;
BigDecimal flo[]=new BigDecimal[post.length];
BigDecimal f1;
float f;
int k=0;
for (int i = 0; i < post.length; i++) {
if (post[i].isNumber) {
stack.push(post[i]);
pin[0]=new BigDecimal(post[i].number);
flo[0]=new BigDecimal(new Float(post[i].number));
continue;
}
if (post[i].isOperator) {
MathematicElement mx2 = stack.pop();
double modifier;
if(system==MathematicalNumberingSystem.DEGREES)
modifier = pi/180;
else
modifier = 1;
double x2 = mx2.number, x1, y;
float f2=new Float(x2);
BigDecimal f22=new BigDecimal(f2);
BigDecimal b2=new BigDecimal(x2);
switch (post[i].operator) {
case PLUS:
x1 = stack.pop().number;
b1=new BigDecimal(x1);
pin[0]=b1.add(b2);
f=new Float(x1);
f1=new BigDecimal(f);
flo[0]=f1.add(f22);
//System.out.format("the b1=%20.16f and the b2=%20.16f \n",b1,b2);
y = x1 + x2;
//FloatingPointNumber(x1);
//FloatingPointNumber(x2);
//FloatingPointNumber(y);
stack.push(new MathematicElement(y));
k++;
答案 0 :(得分:0)
你可以像你一样用BigDecimal做到这一点,但是在这个例子中,1(一)可以在基数2(二)上表示,所以计算机保持正确的值= D
答案 1 :(得分:0)
0.4d + 0.6d最终等于1.0d。我相信BigDecimal会将其降低到1d以节省内存。
换句话说,你已经有了答案:)