Java 在android中,如何在不损失精度的情况下对结果进行取整

Java 在android中,如何在不损失精度的情况下对结果进行取整,java,rounding,precision,bigdecimal,Java,Rounding,Precision,Bigdecimal,我正在android中构建一个基本的计算器功能。 但是,当结果显示在文本视图中时,我在将数字四舍五入方面遇到了一些小问题 我在做123456789*123456789的乘法运算,得到的结果在我的文本视图中无法容纳。 当在Android内置计算器中执行上述操作时,实际结果为1.5241E16。 有人能告诉我如何在我的计算器应用程序中实现这个结果吗? 下面是关于我正在尝试做的事情的小片段: public static double round(double unrounded, int precis

我正在android中构建一个基本的计算器功能。 但是,当结果显示在文本视图中时,我在将数字四舍五入方面遇到了一些小问题

我在做123456789*123456789的乘法运算,得到的结果在我的文本视图中无法容纳。 当在Android内置计算器中执行上述操作时,实际结果为1.5241E16。 有人能告诉我如何在我的计算器应用程序中实现这个结果吗? 下面是关于我正在尝试做的事情的小片段:

public static double round(double unrounded, int precision, int roundingMode)
    {
        BigDecimal bd = new BigDecimal(unrounded);
        BigDecimal rounded = bd.setScale(precision, roundingMode);
        return rounded.doubleValue();
    }

    num = num * Double.parseDouble(txtCalc.getText().toString());
    num = round(num, 3, BigDecimal.ROUND_HALF_UP); //where 3 is the precision of number

请帮助我获得1…9*1…9的结果1.5241E16

科学记数法不会失去准确性。1.5241E16仅表示答案大约为1.5241*100000000000000,这意味着如果您可以决定要显示的小数位数,您可以将数字除以10^X并连接结果

所以如果我得到的数字是1234567890,我想把它显示到小数点后3位。我会做1234567890/10^9(因为第一个数字后面有9个数字),然后我会简单地取消字符5后面的所有内容(1位代表整数,1位代表点,然后是3位小数)。如果要将最后一位小数舍入,只需检查第6位的数字是否大于或等于5,然后将最后一位数字增加1

这里给出了你想要的结果

double num1 = 123456789L;
double num2 = 123456789L;
String result = num1*num2+"";
if(result.contains("E")){ //if result is in scientific notation
    //take the first 6 characters only and part containing the E, drop everything else.
    result = result.substring(0, 6) + result.substring(result.indexOf("E"));
}
System.out.println("Result is = " + result);
Groovy shell的输出:

结果为=1.5241E16


四舍五入问题的一种解决方案

package com.test;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * @VinTech Blogs
 * @vintech2277.blogspot.com
 *
 */
public class SumSame 
{
    public static void main( String[] args )
    {
     String[] from= {"3.2571365449","4.87608977397","5.29831575733","1.5684579238"};
     BigDecimal[] fromBD = new BigDecimal[from.length];
     BigDecimal[] toBD = new BigDecimal[from.length];

     BigDecimal diff = new BigDecimal("0");
     int high = 0;
     int low = 0;

     for(int i=0;i0) if(fromBD[i].compareTo(fromBD[high]) > 0){
         high= i;
        }else if(fromBD[i].compareTo(fromBD[low]) < 0){
         low= i;
        }
      //set scale to 2 means 2 digits after decimal               
                // HALf_DOWN means 11.45 rounds to 11.4
                //HALF_UP means 11.45 rounds to 11.5
      toBD[i] = fromBD[i].setScale(2, RoundingMode.HALF_DOWN);
      diff = diff.add(fromBD[i].subtract(toBD[i]));
     }    

     //We get the difference here and allocate the diffs to highest or lowest based
     //on diff value type
     if(diff.doubleValue() > 0.0){
      toBD[low]=toBD[low].add(diff).setScale(2,RoundingMode.HALF_DOWN);
     }else if(diff.doubleValue() < 0.0){
      toBD[high]=toBD[high].add(diff).setScale(2,RoundingMode.HALF_DOWN);
     }   

     for (BigDecimal bigDecimal : toBD) {
   System.out.println("val is "+bigDecimal);
  }
    }
}
package.com.test;
导入java.math.BigDecimal;
导入java.math.RoundingMode;
/**
*@VinTech博客
*@vintech2277.blogspot.com
*
*/
公共类Summe
{
公共静态void main(字符串[]args)
{
字符串[]from={“3.2571365449”、“4.87608977397”、“5.29831575733”、“1.5684579238”};
BigDecimal[]fromBD=新的BigDecimal[from.length];
BigDecimal[]toBD=新的BigDecimal[from.length];
BigDecimal diff=新的BigDecimal(“0”);
int高=0;
int低=0;
对于(int i=0;i0)if(fromBD[i]。比较到(fromBD[high])>0{
高=i;
}else if(fromBD[i].compareTo(fromBD[low])<0){
低=i;
}
//将比例设置为2表示小数点后的2位数字
//半下意味着11.45轮到11.4轮
//一半以上意味着11.45轮到11.5轮
toBD[i]=fromBD[i]。设置刻度(2,舍入模式。半向下);
diff=diff.add(fromBD[i].减(toBD[i]);
}    
//我们在这里得到差异,并将差异分配到最高或最低的基础上
//关于差值类型
if(diff.doubleValue()>0.0){
toBD[low]=toBD[low]。添加(差异)。设置刻度(2,舍入模式。半向下);
}else if(diff.doubleValue()<0.0){
toBD[high]=toBD[high]。添加(差异)。设置刻度(2,舍入模式。半向下);
}   
for(BigDecimal BigDecimal:toBD){
System.out.println(“val是”+bigDecimal);
}
}
}

我很困惑,你得到了什么结果?科学记数法确实会失去准确性。1.5241E16只是表示答案大约为1.5241*100000000000000,这意味着如果您可以决定要显示的小数位数,您只需将数字除以10^X并将结果串联起来。是,同样,我也只想将结果四舍五入到1.5241E16。我在下面的答案中添加了代码,给出了您想要的结果。:但是如何知道用户输入的位数?i、 在你的情况下是10^9。任何代码片段都会对我有帮助,因为我的数学不是那么容易:)。谢谢,在上面的代码中,我只是在进行任何连接之前检查E。当然,您必须在其中添加一些检查,例如,如果
result.indexOf(“E”)>6
,然后才进行连接。否则,您的结果将最多保留4位小数。@Ali:谢谢,它成功了!正是我想要的。它是否适用于该范围内的所有类型的数字?