Как округлить результат, не теряя своей точности в Android - PullRequest
0 голосов
/ 11 августа 2011

Я строю основные функции калькулятора в Android.Но я сталкиваюсь с небольшой проблемой округления чисел, когда результат отображается в TextView.

Я делаю умножение 123456789 * 123456789 и получаю результат, который я не могу разместить в моем TextView.Также фактический результат вышеописанной операции - 1,5241E16 при выполнении во встроенном калькуляторе Android.Может кто-нибудь сказать мне, как я могу достичь этого результата в моем приложении калькулятора?Ниже приведен небольшой фрагмент о том, что я пытаюсь сделать:

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.5241E16 за 1 ... 9 * 1 .... 9

Ответы [ 2 ]

1 голос
/ 11 августа 2011

Научная запись теряет точность.1.5241E16 просто означает, что ответ примерно равен 1,5241 * 10 000 000 000 000 000, то есть если вы можете решить, сколько десятичных разрядов вы хотите отобразить, вы можете просто разделить свое число на 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:

Результат = 1.5241E16

0 голосов
/ 16 мая 2013

Одно решение проблемы округления

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);
  }
    }
}
...