2015-10-05 24 views
0

我创建一个程序,它在公制系统中占用一个基本单位。 (说克。)然后当你选择一个前缀改变它的等值。 (例如,当您选择Kilo时,1000克会将其更改为1公斤)。使用BigIntegers

问题是,当我运行代码时,它总是最终为零,这让我认为我在操纵BigIntegers错误。 (我使用非常大的数字,因为一些前缀是非常小的或超出通常长一些非常大)

下面是代码:

import java.util.Scanner; 
import java.math.BigInteger; 

public class BaseMetricUnits { 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    System.out.println("Hello, World!"); 
    float meter = 1; 
    float kilogram = 1; 
    float second = 1; 
    float ampere = 1; 
    float kelvin = 1; 
    float mole = 1; 
    float candela = 1; 
    PrefixConverter(); 
} 
public static void PrefixConverter() 
{ 

    BigInteger Yocto = BigInteger.valueOf((long) 0.00000000000000000000000); 
    BigInteger Zepto = BigInteger.valueOf((long) 0.000000000000000000001); 
    BigInteger Atto = BigInteger.valueOf((long) 0.000000000000000001); 
    BigInteger Femto = BigInteger.valueOf((long) 0.000000000000001); 
    BigInteger Pico = BigInteger.valueOf((long)0.000000000001); 
    BigInteger Nano = BigInteger.valueOf((long)0.000000001); 
    BigInteger Micro = BigInteger.valueOf((long)0.000001); 
    BigInteger Milli = BigInteger.valueOf((long)0.001); 
    BigInteger Centi = BigInteger.valueOf((long)0.01); 
    BigInteger Deci = BigInteger.valueOf((long)0.1); 
    BigInteger Deca = BigInteger.valueOf((long)10); 
    BigInteger Hecto = BigInteger.valueOf((long)100); 
    BigInteger Kilo = BigInteger.valueOf((long)1000); 
    BigInteger Mega = BigInteger.valueOf((long)1000000); 
    BigInteger Giga = BigInteger.valueOf((long)1000000000); 
    BigInteger Tera = new BigInteger("1000000000000"); 
    BigInteger Peta = new BigInteger("1000000000000000"); 
    BigInteger Exa = new BigInteger("1000000000000000000"); 
    BigInteger Zetta = new BigInteger("1000000000000000000000"); 
    BigInteger Yotta = new BigInteger("1000000000000000000000000"); 

    long Amount; 
    double Prefix; 
    String Units = ""; 
    BigInteger translatedResult; 
    BigInteger Result; 

    Scanner inputDevice = new Scanner(System.in); 
    System.out.print("Please enter the type of unit to be used. (meters, grams, etc.) >> "); 
    Units = inputDevice.next(); 
    System.out.print("Please enter an amount to be translated >> "); 
    Amount = inputDevice.nextLong(); 
    System.out.print("Please choose one of the following Prefixes to translate to. "); 
    System.out.print(" 1 - Yocto "); 
    System.out.print(" 2 - Zepto "); 
    System.out.print(" 3 - Atto "); 
    System.out.print(" 4 - Femto "); 
    System.out.print(" 5 - Pico "); 
    System.out.print(" 6 - Nano "); 
    System.out.print(" 7 - Micro "); 
    System.out.print(" 8 - Milli "); 
    System.out.print(" 9 - Centi "); 
    System.out.print(" 10 - Deci "); 
    System.out.print(" 11 - Deca "); 
    System.out.print(" 12 - Hecto "); 
    System.out.print(" 13 - Kilo "); 
    System.out.print(" 14 - Mega "); 
    System.out.print(" 15 - Giga "); 
    System.out.print(" 16 - Tera "); 
    System.out.print(" 17 - Peta "); 
    System.out.print(" 18 - Exa "); 
    System.out.print(" 19 - Zetta "); 
    System.out.print(" 20 - Yotta ") ; 
    Prefix = inputDevice.nextDouble(); 

    if(Prefix == 1) 
    { 
     Result = Yocto.multiply(BigInteger.valueOf(Amount)); 
     translatedResult = Yocto.divide(BigInteger.valueOf(Amount)); 
     System.out.println("You have " + Result + " " + Units + " which translates to " + translatedResult + "Yocto" + Units + "."); 
    } 
    if(Prefix == 2) 
    { 
     Result = Zepto.multiply(BigInteger.valueOf(Amount)); 
     translatedResult = Zepto.divide(BigInteger.valueOf(Amount)); 
     System.out.println("You have " + Result + " " + Units + " which translates to " + translatedResult + "Zepto" + Units + "."); 
    } 
    if(Prefix == 3) 
    { 
     Result = Atto.multiply(BigInteger.valueOf(Amount)); 
     translatedResult = Atto.divide(BigInteger.valueOf(Amount)); 
     System.out.println("You have " + Result + " " + Units + " which translates to " + translatedResult + "Atto" + Units + "."); 
    } 
    if(Prefix == 4) 
    { 
     Result = Femto.multiply(BigInteger.valueOf(Amount)); 
     translatedResult = Femto.divide(BigInteger.valueOf(Amount)); 
     System.out.println("You have " + Result + " " + Units + " which translates to " + translatedResult + "Femto" + Units + "."); 
    } 
    if(Prefix == 5) 
    { 
     Result = Pico.multiply(BigInteger.valueOf(Amount)); 
     translatedResult = Pico.divide(BigInteger.valueOf(Amount)); 
     System.out.println("You have " + Result + " " + Units + " which translates to " + translatedResult + "Pico" + Units + "."); 
    } 
    if(Prefix == 6) 
    { 
     Result = Nano.multiply(BigInteger.valueOf(Amount)); 
     translatedResult = Nano.divide(BigInteger.valueOf(Amount)); 
     System.out.println("You have " + Result + " " + Units + " which translates to " + translatedResult + "Nano" + Units + "."); 
    } 
    if(Prefix == 7) 
    { 
     Result = Micro.multiply(BigInteger.valueOf(Amount)); 
     translatedResult = Micro.divide(BigInteger.valueOf(Amount)); 
     System.out.println("You have " + Result + " " + Units + " which translates to " + translatedResult + "Micro" + Units + "."); 
    } 
    if(Prefix == 8) 
    { 
     Result = Milli.multiply(BigInteger.valueOf(Amount)); 
     translatedResult = Milli.divide(BigInteger.valueOf(Amount)); 
     System.out.println("You have " + Result + " " + Units + " which translates to " + translatedResult + "Milli" + Units + "."); 
    } 
    if(Prefix == 9) 
    { 
     Result = Centi.multiply(BigInteger.valueOf(Amount)); 
     translatedResult = Centi.divide(BigInteger.valueOf(Amount)); 
     System.out.println("You have " + Result + " " + Units + " which translates to " + translatedResult + "Centi" + Units + "."); 
    } 
    if(Prefix == 10) 
    { 
     Result = Deci.multiply(BigInteger.valueOf(Amount)); 
     translatedResult = Deci.divide(BigInteger.valueOf(Amount)); 
     System.out.println("You have " + Result + " " + Units + " which translates to " + translatedResult + "Deci" + Units + "."); 
    } 
    if(Prefix == 11) 
    { 
     Result = Deca.multiply(BigInteger.valueOf(Amount)); 
     translatedResult = Deca.divide(BigInteger.valueOf(Amount)); 
     System.out.println("You have " + Result + " " + Units + " which translates to " + translatedResult + "Deca" + Units + "."); 
    } 
    if(Prefix == 12) 
    { 
     Result = Hecto.multiply(BigInteger.valueOf(Amount)); 
     translatedResult = Hecto.divide(BigInteger.valueOf(Amount)); 
     System.out.println("You have " + Result + " " + Units + " which translates to " + translatedResult + "Hecto" + Units + "."); 
    } 
    if(Prefix == 13) 
    { 
     Result = Kilo.multiply(BigInteger.valueOf(Amount)); 
     translatedResult = Kilo.divide(BigInteger.valueOf(Amount)); 
     System.out.println("You have " + Result + " " + Units + " which translates to " + translatedResult + "Kilo" + Units + "."); 
    } 
    if(Prefix == 14) 
    { 
     Result = Mega.multiply(BigInteger.valueOf(Amount)); 
     translatedResult = Mega.divide(BigInteger.valueOf(Amount)); 
     System.out.println("You have " + Result + " " + Units + " which translates to " + translatedResult + "Mega" + Units + "."); 
    } 
    if(Prefix == 15) 
    { 
     Result = Giga.multiply(BigInteger.valueOf(Amount)); 
     translatedResult = Giga.divide(BigInteger.valueOf(Amount)); 
     System.out.println("You have " + Result + " " + Units + " which translates to " + translatedResult + "Giga" + Units + "."); 
    } 
    if(Prefix == 16) 
    { 
     Result = Tera.multiply(BigInteger.valueOf(Amount)); 
     translatedResult = Tera.divide(BigInteger.valueOf(Amount)); 
     System.out.println("You have " + Result + " " + Units + " which translates to " + translatedResult + "Tera" + Units + "."); 
    } 
    if(Prefix == 17) 
    { 
     Result = Peta.multiply(BigInteger.valueOf(Amount)); 
     translatedResult = Peta.divide(BigInteger.valueOf(Amount)); 
     System.out.println("You have " + Result + " " + Units + " which translates to " + translatedResult + "Peta" + Units + "."); 
    } 
    if(Prefix == 18) 
    { 
     Result = Exa.multiply(BigInteger.valueOf(Amount)); 
     translatedResult = Exa.divide(BigInteger.valueOf(Amount)); 
     System.out.println("You have " + Result + " " + Units + " which translates to " + translatedResult + "Exa" + Units + "."); 
    } 
    if(Prefix == 19) 
    { 
     Result = Zetta.multiply(BigInteger.valueOf(Amount)); 
     translatedResult = Zetta.divide(BigInteger.valueOf(Amount)); 
     System.out.println("You have " + Result + " " + Units + " which translates to " + translatedResult + "Zetta" + Units + "."); 
    } 
    if(Prefix == 20) 
    { 
     Result = Yotta.multiply(BigInteger.valueOf(Amount)); 
     translatedResult = Yotta.divide(BigInteger.valueOf(Amount)); 
     System.out.println("You have " + Result + " " + Units + " which translates to " + translatedResult + "Yotta" + Units + "."); 
    } 
    else 
    { 
     System.out.println("Not a valid input."); 
    } 
    } 
} 

感谢您的帮助。

+2

'(长)0.000000000000000000001 == 0L'等演员基本上采用数量的整数部分。你有没有很好的理由不使用像“Tera”,“Peta”等那样的“0.000000000000000000001”?或'BigInteger.ONE.shiftRight/Left'? –

+0

我刚刚意识到我混合了乘法和除法的方法,说有些答案仍然出现为0. – dpolaristar

+0

@AndyTurner像第一个BigInteger Yocto这样的小数字,例如它会抛出我这些奇怪的错误。 异常在线程 “主” java.lang.NumberFormatException:对于输入字符串:” 0.00000" \t在java.lang.NumberFormatException.forInputString(未知来源) \t在java.lang.Integer.parseInt(未知源) \t位于java.math.BigInteger。 (Unknown Source) \t at java.math.BigInteger。 (来源不明) \t在BaseMetricUnits.PrefixConverter(BaseMetricUnits.java:21) \t在BaseMetricUnits.main(BaseMetricUnits.java:16) 像这些。 – dpolaristar

回答

1

BigInteger只能存储整数,所以不适合这个应用程序的数据类型。我强烈建议用BigDecimal替换它。

你也应该用分数的字符串表示初始化:对这个答案和问题

BigDecimal Zepto = new BigDecimal("0.000000000000000000001"); 
    BigDecimal Atto = new BigDecimal("0.000000000000000001"); 
    BigDecimal Femto = new BigDecimal("0.000000000000001"); 
    BigDecimal Pico = new BigDecimal("0.000000000001"); 
    BigDecimal Nano = new BigDecimal("0.000000001"); 

评论表明使用的BigDecimal存储较大的数字值得关注。该程序说明了一个事实,这是不是一个问题:

import java.math.BigDecimal; 

public class Test { 
    public static void main(String[] args) { 
    BigDecimal googol = new BigDecimal("1e100"); 
    System.out.println(googol); 
    System.out.println(googol.add(BigDecimal.ONE)); 
    } 
} 

输出:

1E+100 
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 
+0

如果你向下看代码,它会将结果吐出“结果”和“翻译结果”。除非我能想出一种方法,使其成为基于上下文的BigInteger或BigDecimal,否则最终答案可能是其中一个。我担心如果用户想要将一克转换成Yottagram,然后BigInteger的答案会陷入一个错误,试图存储一个小数,反之亦然。 - – dpolaristar

+1

为什么你想要结果成为BigInteger?如果答案不是整数,那将会丢失数据。另一方面,BigDecimal可以存储任何BigInteger可以存储的内容。 –

+0

因此,我可以存储所有的数字,即使是BigDecimal的大数字?我不知道。 – dpolaristar