2011-08-11 46 views
0

我正在android中構建一個基本的計算器功能。 但是,當結果顯示在TextView中時,我正面臨着將數字四捨五入的問題。如何在不損失精度的情況下取得結果android

我正在做123456789 * 123456789的乘法,並得到我無法在我的TextView中適應的結果。 此外,上述操作的實際結果是在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 

plz幫助我達到的效果1.5241E16 1 ... 9 * 1 .... 9

+0

我很困惑,什麼結果都你得到了嗎?科學計數法**確實會失去準確性。 1.5241E16僅僅意味着答案大致爲1.5241 * 10,000,000,000,000,000,這意味着如果您可以決定要顯示多少個小數位,則可以將您的數字除以10^X並連接結果。 – Ali

+0

雅,就像我也只是想把我的結果彙總到1.5241E16一樣。 – YuDroid

+0

我已在下面的答案中添加了代碼,它提供了您想要的結果。 – Ali

回答

1

科學記數法會失去準確性。 1.5241E16僅僅意味着答案大致爲1.5241 * 10,000,000,000,000,000,這意味着如果您可以決定要顯示多少個小數位,則可以將您的數字除以10^X並連接結果。

所以,如果我的結果編號是1234567890,我想顯示這3位小數位。我會做1234567890/10^9(因爲在第一個數字後有9位數字),然後我會簡單地在char 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

:但如何知道用戶輸入的位數?即你的情況是10^9。任何代碼片段都會對我有所幫助,因爲我對數學並不那麼容易:)。謝謝阿里 – YuDroid

+0

在上面的代碼中,我只是在做任何級聯之前檢查E。例如,如果'result.indexOf(「E」)> 6'只有這樣連接在一起,你當然必須在那裏進行更多的檢查。反正你的結果最多有4位小數。 – Ali

+0

@阿里:謝謝,它工作!正是我在找什麼。它是否適用於範圍內的所有類型的數字? – YuDroid

0

一個解決方案,以四捨五入問題

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); 
    } 
    } 
} 
相關問題