2017-01-20 4 views
-1

別のプロジェクトでは、ユーザーに金銭的価値を求めるプロンプトを出し、最高のものから始まる最低限の請求書とコインを印刷するプログラムを作成することになっています。したがって、たとえば、ユーザの入力47.63あれば、出力は次のようになります。番号をJavaの単語に変換する方法Javaで資金を計算する

0何百 2個の二十代 0十など

私の問題は、私が特定の値(すなわち186.41)に入れたときにということです私は1何百 1フィフティーズ 1のTwenties 1テン 1ファイブ 1ワンズ 1四半期 1ダイム 1 Nickles 1ペニーで出てくるはずです。

ペニーの私の出力は「0ペニー」 言うしかし、ここに私のコードです:

public class CountingMoney { 
    public static BufferedReader delta = new BufferedReader(new InputStreamReader(System.in)); 
    public static void main(String [] args) throws IOException{ 
     run(); 
    } 

    public static void run() throws IOException{ 
     System.out.println("Please enter your monetary value"); 
     String userinput = delta.readLine(); 
     double input = Double.parseDouble(userinput); 

     int amount = (int) (input/100); 
     input -= amount * 100; 
     System.out.println(amount+ " Hundreds"); 

     amount = (int) (input/50); 
     input -= amount * 50; 
     System.out.println(amount + " Fifties"); 

     amount = (int) (input/20); 
     input -= amount * 20; 
     System.out.println(amount + " Twenties"); 

     amount = (int) (input/10); 
     input -= amount*10; 
     System.out.println(amount + " Tens"); 

     amount = (int) (input/5); 
     input -= amount *5; 
     System.out.println(amount + " Fives"); 

     amount = (int) (input/1); 
     input -= amount *1; 
     System.out.println(amount + " Ones"); 

     amount = (int) (input/.25); 
     input -= amount * .25; 
     System.out.println(amount + " Quarters"); 

     amount = (int) (input/.10); 
     input -= amount * .10; 
     System.out.println(amount + " Dimes"); 

     amount = (int) (input/.05); 
     input -= amount * .05; 
     System.out.println(amount + " Nickles"); 

     amount = (int) (input/.01); 
     input -= amount * .01; 
     System.out.println(amount + " Pennies"); 

    } 

} 
+2

それを –

+0

をデバッグしようと、それはおそらく、丸め誤差浮動小数点ですように見えます。あなたが正確さを気にしているならば、金額に 'double'を使うべきではありません。さもなければ、あなたが見ているもののように、非常に小さなエラーが入り込んでしまいます。 'double'の代わりに' BigDecimal'を使ってみてください。 –

+0

@DavidWallaceありがとうございました – MehLdy

答えて

0

、それは関係なく常にdouble値はそれ以上の整数にどれだけ近いか、切り捨てません。 doublesは、186.41のような値を正確に表すことができません。なぜなら、それらは10進数ではなく2進数で格納されているからです。それらを使って多くの計算を開始すると、エラーが蓄積し始めます。

私はあなたのプログラムを試してみて、丸みを帯びています値を示しています。

System.out.println("result of division is " + (input/.01)); 
    amount = (int) (input/.01); 
    input -= amount * .01; 
    System.out.println(amount + " Pennies"); 

それは

result of division is 0.999999999999658 

これは1に非常に、非常に近いので、それだけではないエラーがされているを表示します蓄積された。しかしそれは正確ではありません。

1)他の回答で提案されているようにBigDecimal使用しますとダウン(int)ラウンドにキャストするので、amountは0

これを解決するには、2つの方法がありますでしょう。これは、お金を扱うための好ましい方法です。それは小数点以下を正確に表します。

2)(int)の代わりにMath.round()を使用してください。 double

amount = (int) Math.round(input/.01); 

Math.roundあなたはまだキャストが必要ですが、何の丸めが関与していないので、それは別の整数に整数からキャストですので、longを返します。

私はまだBigDecimalを使用することをお勧めします。しかし、これは、doubleに対処する必要がある他の状況では、どのような丸めをするかに注意する必要があることがわかります。 (int)へのキャスティングは、あなたがしようとしていることに応じて間違っていることがよくあります。

0

あなたが直面している問題は優れているがhere上で説明しました。

BigDecimalを克服するために。ただし、ScaleRoundingModeを設定してください。
分割操作中にjava.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.になることがあります。変更方法の

サンプルコード:あなたは(int)intdoubleを唱えたとき

amount = bigDecimal.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).intValue(); 
bigDecimal = bigDecimal.subtract(new BigDecimal(amount * 100)); 
System.out.println(amount+ " Hundreds"); 
0

あなたは、コードの下に使用することができますし、それはあなたがthis stack-overflow post

が、それはあなたの必要性を解決することを願っています参照することができ、より参照して議論については、このlink

で利用可能です。

package com.test;

import java.text.DecimalFormat;

パブリッククラスEnglishNumberToWords {

private static final String[] tensNames = { 
    "", 
    " ten", 
    " twenty", 
    " thirty", 
    " forty", 
    " fifty", 
    " sixty", 
    " seventy", 
    " eighty", 
    " ninety" 
}; 

private static final String[] numNames = { 
    "", 
    " one", 
    " two", 
    " three", 
    " four", 
    " five", 
    " six", 
    " seven", 
    " eight", 
    " nine", 
    " ten", 
    " eleven", 
    " twelve", 
    " thirteen", 
    " fourteen", 
    " fifteen", 
    " sixteen", 
    " seventeen", 
    " eighteen", 
    " nineteen" 
}; 

private EnglishNumberToWords() {} 

private static String convertLessThanOneThousand(int number) { 
    String soFar; 

    if (number % 100 < 20){ 
     soFar = numNames[number % 100]; 
     number /= 100; 
    } 
    else { 
     soFar = numNames[number % 10]; 
     number /= 10; 

     soFar = tensNames[number % 10] + soFar; 
     number /= 10; 
    } 
    if (number == 0) { 
     return soFar; 
    } 
    return numNames[number] + " hundred" + soFar; 
} 


public static String convert(long number) { 
    // 0 to 999 999 999 999 
    if (number == 0) { return "zero"; } 

    String snumber = Long.toString(number); 

    // pad with "0" 
    String mask = "000000000000"; 
    DecimalFormat df = new DecimalFormat(mask); 
    snumber = df.format(number); 

    // XXXnnnnnnnnn 
    int billions = Integer.parseInt(snumber.substring(0,3)); 
    // nnnXXXnnnnnn 
    int millions = Integer.parseInt(snumber.substring(3,6)); 
    // nnnnnnXXXnnn 
    int hundredThousands = Integer.parseInt(snumber.substring(6,9)); 
    // nnnnnnnnnXXX 
    int thousands = Integer.parseInt(snumber.substring(9,12)); 

    String tradBillions; 
    switch (billions) { 
     case 0: 
      tradBillions = ""; 
      break; 
     case 1 : 
      tradBillions = convertLessThanOneThousand(billions) 
      + " billion "; 
      break; 
     default : 
      tradBillions = convertLessThanOneThousand(billions) 
      + " billion "; 
    } 
    String result = tradBillions; 

    String tradMillions; 
    switch (millions) { 
     case 0: 
      tradMillions = ""; 
      break; 
     case 1 : 
      tradMillions = convertLessThanOneThousand(millions) 
      + " million "; 
      break; 
     default : 
      tradMillions = convertLessThanOneThousand(millions) 
      + " million "; 
    } 
    result = result + tradMillions; 

    String tradHundredThousands; 
    switch (hundredThousands) { 
     case 0: 
      tradHundredThousands = ""; 
      break; 
     case 1 : 
      tradHundredThousands = "one thousand "; 
      break; 
     default : 
      tradHundredThousands = convertLessThanOneThousand(hundredThousands) 
      + " thousand "; 
    } 
    result = result + tradHundredThousands; 

    String tradThousand; 
    tradThousand = convertLessThanOneThousand(thousands); 
    result = result + tradThousand; 

    // remove extra spaces! 
    return result.replaceAll("^\\s+", "").replaceAll("\\b\\s{2,}\\b", " "); 
} 

/** 
* testing 
* @param args 
*/ 
public static void main(String[] args) { 
    System.out.println("*0* " + EnglishNumberToWords.convert(0)); 
    System.out.println("*1* " + EnglishNumberToWords.convert(1)); 
    System.out.println("*16* " + EnglishNumberToWords.convert(16)); 
    System.out.println("*100* " + EnglishNumberToWords.convert(100)); 
    System.out.println("*118* " + EnglishNumberToWords.convert(118)); 
    System.out.println("*200* " + EnglishNumberToWords.convert(200)); 
    System.out.println("*219* " + EnglishNumberToWords.convert(219)); 
    System.out.println("*800* " + EnglishNumberToWords.convert(800)); 
    System.out.println("*801* " + EnglishNumberToWords.convert(801)); 
    System.out.println("*1316* " + EnglishNumberToWords.convert(1316)); 
    System.out.println("*1316* " + EnglishNumberToWords.convert(1316)); 
    System.out.println("*2000000* " + EnglishNumberToWords.convert(2000000)); 
    System.out.println("*3000200* " + EnglishNumberToWords.convert(3000200)); 
    System.out.println("*700000* " + EnglishNumberToWords.convert(700000)); 
    System.out.println("*9000000* " + EnglishNumberToWords.convert(9000000)); 
    System.out.println("*9001000* " + EnglishNumberToWords.convert(9001000)); 
    System.out.println("*123456789* " + EnglishNumberToWords.convert(123456789)); 
    System.out.println("*2147483647* " + EnglishNumberToWords.convert(2147483647)); 
    System.out.println("*3000000010L* " + EnglishNumberToWords.convert(3000000010L)); 


} 

}

+0

これは、OPの元のコードとはかなり異なるものです。まったく異なる質問に対する良い答えと思われます。 –

関連する問題