昨天做了一道 面试题 本来以为很简单的 结果出了点岔子 发现原因后简直无语
原来浮点类型的数值 在数值达到1000W时 java中会用科学计数法表示 平常没有注意到
float f =120_024_436f; double d=120_024_436d; int i= 120_024_436; 结果依次为: 1.20024432E8 1.20024436E8 120024436同样的实际值 不同类型的表示 其中f的精度还降低了
如果不想用科学计数法 必须进行格式化操作 再进行处理
package com.test;
import java.text.DecimalFormat ;
import java.util.Scanner ;
public class RmbToChar {
public static void main(String[] args) {
// 防止 double 类型的转字符串以科学计数法表示
Scanner scan = new Scanner(System. in) ; //
System. out.print( " 请输入金额: ") ;
double rst = scan.nextDouble() ;
rmbToChar(rst) ; // 接收金额数
}
// 思路 先把数转化 String 类型的字符串
private static void rmbToChar( doublev) { // 形参为金额数
// String num=Double.toString(v);
DecimalFormat decimalFormat = new DecimalFormat( ".0000") ; // 数字格式化 避免科学计数法跟逗号
// String num = decimalFormat.format(v).replace(",",""); // 去除 “ , ”
String num = decimalFormat.format(v) ;
/* 大写码表 */
String[] numberMap = { " 零 " , " 壹 " , " 贰 " , " 叁 " , " 肆 " , " 伍 " , " 陆 " , " 柒 " , " 捌 " , " 玖 "} ;
/* 整数部分
* 用 substring() 分割整数部分小数部分
* */
String integerPart = num.substring( 0 ,num.indexOf( ".")) ;
/* 小数部分 */
String decimalsPart = num.substring(num.indexOf( ".") + 1 , num.length()) ;
/* 测试是否分离成功 */
System. out.println(integerPart + decimalsPart) ;
// 将整数部分字符串分割成字符装入一个字符类型的数组容器
char[] integerParts = integerPart.toCharArray() ;
// 将小数部分字符串分割成字符装入一个字符类型的数组容器
char[] decimalsParts = decimalsPart.toCharArray() ;
// // 打印整数部分
//
for ( int i = 0 ;i < integerParts. length ;i++) {
System. out.print(numberMap[Integer. parseInt(String. valueOf(integerParts[i]))]) ;
switch (integerParts. length- i) {
case 10:
System. out.print( " 拾 ") ;
break;
case 9:
System. out.print( " 亿 ") ;
break;
case 8:
System. out.print( " 仟 ") ;
break;
case 7:
System. out.print( " 佰 ") ;
break;
case 6:
System. out.print( " 拾 ") ;
break;
case 5:
System. out.print( " 万 ") ;
break;
case 4:
System. out.print( " 仟 ") ;
break;
case 3:
System. out.print( " 佰 ") ;
break;
case 2:
System. out.print( " 拾 ") ;
break;
default:
System. out.print( " 圆 ") ;
}
}
// 打印小数部分
if(Integer. parseInt(decimalsPart) != 0) { // 如果小数为是 非零
for( int i = 0 ;i < decimalsParts. length ;i++) {
System. out.print(numberMap[Integer. parseInt(String. valueOf(decimalsParts[i]))]) ;
switch (i) {
case 0:
System. out.print( " 角 ") ;
break;
case 1:
System. out.print( " 分 ") ;
break;
case 2:
System. out.print( " 厘 ") ;
break;
default:
System. out.print( " 毫 ") ;
}
}
} else { // 小数位 全为零
System. out.print( " 整 ") ;
}
}
}