第二十二章 数字处理类
提纲
- 22.1 数字格式化类
- 22.1.1 为什么要格式化数字
- 22.1.2 Java数据遵原则
- 22.1.3 DecimalFormat类
- 22.1.4 DecimalFormat类中的特殊方法
- 22.2 Math类
- 22.2.1 概念
- 22.2.2 Math方法调用方式
- 22.2.3 常用数学运算方法
- 22.2.3.1 三角函数方法
- 22.2.3.2 指数函数方法
- 22.2.3.3 取整函数方法
- 22.2.4 随机数
- 22.3 Random类
- 22.4 BigInteger类
- 22.5 BigDecimal类
- 22.6 作业
22.1 数字格式化类
- 22.1.1 为什么要格式化数字:数字的格式化在解决实际问题时非常普遍,如表示超市的商品价格,需要保留两位有效数字。Java主要对浮点型数据进行数字格式化操作,其中浮点型数据包括double型和float型数据,在Java中使用java.text.DecimalFormat格式化数字,这里将着重讲解DecimalFormat类。
- 22.1.2 Java数据遵原则:Java中没有格式化的数据遵循以下原则:
- 如果数据绝对值大于0.001并且小于10000000,Java将以常规小数形式表示。
- 如果数据绝对值小于0.001或者大于10000000,Java将以科学记数法表示。
- 22.1.3 DecimalFormat类:由于上述输出格式不能满足解决实际问题的要求,通常将结果格式化为指定形式后输出。在Java中可以使用DecimalFormat类进行格式化操作。
-
概念:DecimalFormat类是抽象类NumberFormat类的一个子类,用于格式化十进制数字。它可以将一些数字格式化为整数、浮点数、百分数等。一般情况下可以在实例化DecimalFormat对象时传递数字格式,也可以通过DecimalFormat类中的applyPattern()方法来实现数字格式化。
-
当格式化数字时,在DecimalFormat类中使用一些特殊字符构成一个格式化模板,使数字按照一定的特殊字符规则进行匹配。
- 0:阿拉伯数字,如果不存在则显示为 0。
- #:阿拉伯数字。
- .:小数分隔符或货币小数分隔符。
- -:减号。
- ,:分组分隔符。
- E:分隔科学计数法中的尾数和指数。在前缀或后缀中无需加引号。
- ;:分隔正数和负数子模式。
- %:乘以 100 并显示为百分数。
- \u2030:乘以 1000 并显示为千分数。
- \u00A4:货币记号,由货币符号替换。如果两个同时出现,则用国际货币符号替换。如果出现在某个模式中,则使用货币小数分隔符,而不使用小数分隔符。
- ‘:用于在前缀或或后缀中为特殊字符加引号,例如 "’#‘#" 将 123 格式化为 “#123”。要创建单引号本身,请连续使用两个单引号:"# o’'clock"。
-
举例:
public class DecimalDemo { //使用实例化对象时设置格式化模式 public static void simgleFormat(String pattern, double value){ DecimalFormat df = new DecimalFormat(pattern); String output = df.format(value); System.out.println("原数字:"+value+",格式化模板:"+pattern+",格式化后:"+output); } //使用applyPattern()方法对数字进行格式化 public static void applyFormat(String pattern, double value){ DecimalFormat df = new DecimalFormat();//实例化DecimalFormat对象 df.applyPattern(pattern);//调用applyPattern()方法设置格式化模板 String output = df.format(value); System.out.println("原数字:"+value+",格式化模板:"+pattern+",格式化后:"+output); } public static void main(String[] args) { //1.格式化小数,该位不存在时,显示0。整数部分出现的0,如果位置上不存在数字用0补充 simgleFormat("0000000000.000", 123456.78); //2.格式化小数,多余的位数会五舍六入。 simgleFormat("000,000.000", 123456.7895); //3.小数后如果位置上不存在数字则不显示,整数部分没有作处理:当小数点前为0时,就会省略0。 applyFormat(".###", 0.78); //4.整数部分加上#会进行处理,整数位置上不存在数字则不显示 applyFormat("##.###", 0.78); //5.相当于*100 并且保留最多两位小数使用百分数,并保留最多两位小数 simgleFormat(".##%", 0.7895); //6.保留两位小数,且小数后两位用0补充 simgleFormat(".00%", 0.78); //7.使用千分号\u2030, 相当于*1000 simgleFormat(".##\u2030", 0.234567); simgleFormat(".##\u2030", 11.234567); //8.使用.00 simgleFormat(".00\u2030", 0.2); simgleFormat(".00\u2030", 11.2); //9.\u00A4货币标识,放在数字前(默认语言环境货币) simgleFormat("\u00A4##.##", 12.345); //10.'Money Amount:',###.###'$',单引号中的内容会当作普通字符处理 simgleFormat("'Money Amount:',###.###'$'", 123.4); simgleFormat("'Money Amount:',###.###'$'", 123.45678); } } //执行结果 原数字:123456.78,格式化模板:0000000000.000,格式化后:0000123456.780 原数字:123456.7895,格式化模板:000,000.000,格式化后:123,456.790 原数字:0.78,格式化模板:.###,格式化后:.78 原数字:0.78,格式化模板:##.###,格式化后:0.78 原数字:0.7895,格式化模板:.##%,格式化后:78.95% 原数字:0.78,格式化模板:.00%,格式化后:78.00% 原数字:0.234567,格式化模板:.##‰,格式化后:234.57‰ 原数字:11.234567,格式化模板:.##‰,格式化后:11234.57‰ 原数字:0.2,格式化模板:.00‰,格式化后:200.00‰ 原数字:11.2,格式化模板:.00‰,格式化后:11200.00‰ 原数字:12.345,格式化模板:¤##.##,格式化后:¥12.34 原数字:123.4,格式化模板:'Money Amount:',###.###'$',格式化后:Money Amount:123.4$ 原数字:123.45678,格式化模板:'Money Amount:',###.###'$',格式化后:Money Amount:123.457$
-
- 22.1.4 DecimalFormat类中的特殊方法
-
方法:setGroupingSize(int newValue);返回值:void;功能释义:设置分组大小。只分整数部分。
-
方法:setGroupingUsed(boolean b);返回值:void;功能释义:设置是否支持分组。
public static void main(String[] args) { DecimalFormat df = new DecimalFormat(); df.setGroupingSize(2); String output = df.format(123456.789); System.out.println("将数字以每两个数字分组:"+output); df.setGroupingUsed(false); String output2 = df.format(123456.789); System.out.println("不允许的数字分组:"+output2); } //执行结果 将数字以每两个数字分组:12,34,56.789 不允许的数字分组:123456.789
-
22.2 Math类
-
22.2.1 概念:在Math类中提供了众多数学函数方法,主要包括三角函数方法、指数函数方法、取整函数方法、取最大值、最小值以及平均值函数方法,这些都被定义为static形式,所以在程序中应用比较简便。
-
22.2.2 Math方法调用方式:
Math.数学方法 Math.常量名
-
22.2.3 常用数学运算方法
-
22.2.3.1 三角函数方法:以下所有方法返回值均为double
-
public static double sin(double a):返回角的三角正弦。
-
public static double cos(double a):返回角的三角余弦。
-
public static double tan(double a):返回角的三角正切。
-
public static double asin(double a):返回一个值的反正弦。
-
public static double acos(double a):返回一个值的反余弦。
-
public static double atan(double a):返回一个值的反正切。
-
public static double toRadians(double angdeg):将角度转换为弧度。
-
public static double toDegrees(double angrad):将弧度转换为角度。
-
举例:
public static void main(String[] args) { //取90°的正弦、余弦、正切 System.out.println("90°的正弦值:"+Math.sin(Math.PI/2)); //接近于0 System.out.println("90°的余弦值:"+Math.cos(Math.PI/2)); //取0°的余弦 System.out.println("0°的余弦值:"+Math.cos(0)); //取60°的正切 System.out.println("60°的正切值:"+Math.tan(Math.PI/3)); //取120°的弧度值 System.out.println("120°的弧度值:"+Math.toRadians(120); //取π/2的角度 System.out.println("π/2的角度值:"+Math.toDegrees(Math.PI/2)); } //执行结果 90°的正弦值:1.0 0°的余弦值:1.0 60°的正切值:0.320040389379563 120°的弧度值:2.0943951023931953 π/2的角度值:90.0
注意:角度与弧度的转换通常是不精确的。
-
-
22.2.3.2 指数函数方法
-
public static double exp(double a):用于获取e的a次方,即取e^a。e=2.7182818284590452354。e,作为数学常数,是自然对数函数的底数。有时称它为欧拉数(Euler number),以瑞士数学家欧拉命名。
-
public static double log(double a):返回 double 值的自然对数(底数是 e)。
-
public static double log10(double a):返回 double 值的底数为 10 的对数。
-
public static double sqrt(double a):返回正确舍入的 double 值的正平方根。其中,a的值不能为负值。
-
public static double cbrt(double a):返回 double 值的立方根。
-
public static double pow(double a, double b):返回第一个参数的第二个参数次幂的值。即a^b。
-
举例:
public static void main(String[] args) { //1.取e的2次方 System.out.println("e的平方值:"+Math.exp(2)); //2.取以e为底2的对数 System.out.println("e为底2的对数:"+Math.log(2)); //3.取以10为底2的对数 System.out.println("10为底2的对数:"+Math.log10(2)); //4.取4的平方根 System.out.println("4的平方根:"+Math.sqrt(4)); //5.取8的立方根 System.out.println("8的立方根:"+Math.cbrt(8)); //6.取2的2次方 System.out.println("2的2次方:"+Math.pow(2, 2)); } //执行结果 e的平方值:7.38905609893065 e为底2的对数:0.6931471805599453 10为底2的对数:0.3010299956639812 4的平方根:2.0 8的立方根:2.0 2的2次方:4.0
-
-
22.2.3.3 取整函数方法
-
public static double ceil(double a):返回大于等于参数的最小整数。向上取整。
-
public static double floor(double a):返回小于等于参数的最大整数,向下取整。
-
public static double rint(double a):返回与参数最接近的整数,如果两个同为整数且同样相近,则结果取偶数。
-
public static int round(float a):返回最接近参数的 int。四舍五入。
-
public static long round(double a):返回最接近参数的 long。
-
举例:
public static void main(String[] args) { //1.返回一个大于等于参数的整数 System.out.println("使用ceil()方法取整5.2:"+Math.ceil(5.2)); //2.返回一个小于等于参数的整数 System.out.println("使用floor()方法取整5.6:"+Math.floor(5.6)); //3.返回与参数最接近的整数 System.out.println("使用rint()方法取整5.4:"+Math.rint(5.4)); System.out.println("使用rint()方法取整5.7:"+Math.rint(5.7)); System.out.println("使用rint()方法取整5.5:"+Math.rint(5.5)); System.out.println("使用rint()方法取整6.5:"+Math.rint(6.5)); //4.返回最接近参数的 int。 System.out.println("使用round()方法取整3.4f:"+Math.round(3.4f)); System.out.println("使用round()方法取整3.6f:"+Math.round(3.6f)); System.out.println("使用round()方法取整3.5f:"+Math.round(3.5f)); System.out.println("使用round()方法取整4.5f:"+Math.round(4.5f)); //5.返回最接近参数的 long。 System.out.println("使用round()方法取整4.5f:"+Math.round(4.5)); } //执行结果 使用ceil()方法取整5.2:6.0 使用floor()方法取整5.6:5.0 使用rint()方法取整5.4:5.0 使用rint()方法取整5.7:6.0 使用rint()方法取整5.5:6.0 使用rint()方法取整6.5:6.0 使用round()方法取整3.4f:3 使用round()方法取整3.6f:4 使用round()方法取整3.5f:4 使用round()方法取整4.5f:5 使用round()方法取整4.5f:5
-
-
-
22.2.4 随机数Math.random()方法
- Math.random()方法释义:此方法用于产生随机数。这个方法默认生成大于等于且小1.0的double型随机数,即0<=Math.random()<1.0。
- 如何随机出0-n的随机数:(int) (Math.random()*n)。
- 如何随机出m-n的随机数,即大于等于m且小于n:m+(int) (Math.random()*(n-m))。
- 随机生成a~z中的一个字母:(char)(‘a’+Math.random()*(‘z’-‘a’+1))。
- 随机生成任意区间的一个字符:(char)(char1+Math.random()*(char2-char1+1))。
22.3 Random类
- 除了Math类中的random()方法可以获取随机数之外,Java中还提供了一种可以获取随机数的方式,那就是java.util.Random类。可以通过实例化一个Random对象创建一个随机数生成器。
- Random类生成随机数原理:Java编译器以系统当前时间作为随机数生成器的种子,因为每时每刻的时间不可能相同,所以产生的随机数不同,但是如果运行速度太快,也会产生两次运行结果相同的随机数。
- 构造方法:Random(long seed):seed,随机数生成器的种子。
- 常用方法:
-
public int nextInt():返回一个随机整数。
-
public int nextInt(int n):返回一个大于等于0且小于n的随机数。
-
public long nextLong():返回一个随机长整型值。
-
public boolean nextBoolean():返回一个随机布尔型值。
-
public float nextFloat():返回一个随机浮点型值。
-
public double nextDouble():返回一个随机双精度型值。
-
public double nextGaussian():返回一个概率密度为高斯分布的双精度值。它是取自此随机数生成器序列的、呈高斯(“正态”)分布的 double 值,其平均值是 0.0,标准差是 1.0。
-
举例:
public static void main(String[] args) { Random r = new Random(); //1.随机产生一个整数 System.out.println("随机产生一个整数:"+r.nextInt()); //2.随机产生一个大于等于0且小于10的整数 System.out.println("随机产生一个大于等于0且小于10的整数:"+r.nextInt(10)); //3.随机产生一个布尔型的值 System.out.println("随机产生一个布尔型的值:"+r.nextBoolean()); //4.随机产生一个双精度型的值 System.out.println("随机产生一个双精度浮点型的值:"+r.nextDouble()); //5.随机产生一个浮点型的值 System.out.println("随机产生一个单精度浮点型的值:"+r.nextFloat()); //6.随机产生一个概率密度为高斯分布的双精度值 System.out.println("随机产生一个概率密度为高斯分布的双精度值:"+r.nextGaussian()); } //执行结果 随机产生一个整数:561645054 随机产生一个大于等于0且小于10的整数:7 随机产生一个布尔型的值:true 随机产生一个双精度型的值:0.45344081093797783 随机产生一个浮点型的值:0.85647845 随机产生一个概率密度为高斯分布的双精度值:1.2081404405125047
-
22.4 BigInteger类
- 为什么使用BigInteger类:由于int的最大值为2^31-1,如果要计算更大的数字,Integer就无法实现了,所以Java中提供了BigInteger类来处理更大的数字。BigInteger支持任意精度的整数,也就是说在运算中BigInteger类型可以准确地表示任何大小的整数值而不会丢失任何信息.在BigInteger类中封装了多种操作,除了基本加减乘除外,还提供了绝对值、相反数、最大公约数、以及判断是否为质数等操作。
- 构造方法
-
BigInteger(String val):将十进制数字字符串转换为BigInteger形式。
BigInteger bi = new BigInteger("22");
-
- 常用方法
-
public BigInteger add(BigInteger val):返回其值为 (this + val) 的 BigInteger。加法。
-
public BigInteger subtract(BigInteger val): 返回其值为 (this - val) 的 BigInteger。减法。
-
public BigInteger multiply(BigInteger val):返回其值为 (this * val) 的 BigInteger。乘法。
-
public BigInteger divide(BigInteger val):返回其值为 (this / val) 的 BigInteger。除法。
-
public BigInteger remainder(BigInteger val):返回其值为 (this % val) 的 BigInteger。取余。
-
public BigInteger[] divideAndRemainder(BigInteger val):返回包含 (this / val) 后跟 (this % val) 的两个 BigInteger 的数组。
-
public BigInteger pow(int exponent):返回其值为 (this ^ exponent) 的 BigInteger。
-
public BigInteger negate():返回其值是 (-this) 的 BigInteger。
-
public BigInteger shiftLeft(int n):返回其值为 (this << n) 的 BigInteger。
-
public BigInteger shiftRight(int n):返回其值为 (this >> n) 的 BigInteger。
-
public BigInteger and(BigInteger val):返回其值为 (this & val) 的 BigInteger。
-
public BigInteger or(BigInteger val):返回其值为 (this | val) 的 BigInteger。
-
public int compareTo(BigInteger val):将此 BigInteger 与指定的 BigInteger 进行比较。
-
public boolean equals(Object x):比较此 BigInteger 与指定的 Object 的相等性。
-
public BigInteger min(BigInteger val):返回此 BigInteger 和 val 的最小值。
-
public BigInteger max(BigInteger val):返回此 BigInteger 和 val 的最大值。
-
举例:
public static void main(String[] args) { //实例化一个大数字 BigInteger bi = new BigInteger("4"); BigInteger bi2 = new BigInteger("2"); //1.取该大数字加2的操作 System.out.println("加法操作:"+bi.add(bi2)); //2.取该大数字减2的操作 System.out.println("减法操作:"+bi.subtract(bi2)); //3.取该大数字乘2的操作 System.out.println("乘法操作:"+bi.multiply(bi2)); //4.取该大数字除2的操作 System.out.println("除法操作:"+bi.divide(bi2)); //5.取该大数字除以3的商和余数 BigInteger bi3 = bi.remainder(bi2); System.out.println("4/2的余数:"+bi3); BigInteger[] biarr = bi.divideAndRemainder(new BigInteger("3")); System.out.println("4/3取商:"+biarr[0]+",4/3取余数:"+biarr[1]); //6.取该大数字的2次方 System.out.println("做二次方操作:"+bi.pow(2)); //7.取该大数字的相反数 System.out.println("取相反数操作:"+bi.negate()); } //执行结果 加法操作:6 减法操作:2 乘法操作:8 除法操作:2 取商:1,取余数:1 做二次方操作:16 取相反数操作:-4
-
22.5 BigDecimal类
-
概述:BigInteger和BigDecimal都能实现大数字的运算,不同的是BigDecimal加入了小数的概念。一般的float型和double型数据只可以用来做科学计算或工程计算,但由于在商业计算中要求数字精度比较高,所以要用到java.math.BigDecimal类。BigDecimal类支持任何精度的定点数,可以用它来精确计算货币值。
-
常用构造方法
- BigDecimal(double val):将 double 转换为 BigDecimal,后者是 double 的二进制浮点值准确的十进制表示形式。
- BigDecimal(String val):将 BigDecimal 的字符串表示形式转换为 BigDecimal。
-
常用方法加减乘除
- public BigDecimal add(BigDecimal augend):返回一个 BigDecimal,其值为 (this + augend),其标度为 max(this.scale(), augend.scale())。加法。
- public BigDecimal subtract(BigDecimal subtrahend):返回一个 BigDecimal,其值为 (this - subtrahend),其标度为 max(this.scale(), subtrahend.scale())。减法。
- public BigDecimal multiply(BigDecimal multiplicand):返回一个 BigDecimal,其值为 (this × multiplicand),其标度为 (this.scale() + multiplicand.scale())。乘法。
- public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode):做除法操作,方法中三个参数分别代表:divisor - 此 BigDecimal 要除以的值。scale - 要返回的 BigDecimal 小数点后的位数。roundingMode - 要应用的舍入模式。roundingMode近似处理模式BigDecimal类中提供了多种处理模式:
- BigDecimal.ROUND_UP:商的最后一位如果大于0,则向前进位,正负数都如此。
- BigDecimal.ROUND_DOWN:商的最后一位无论是什么数字都省略。
- BigDecimal.ROUND_CEILING:商如果是正数,按照ROUND_UP模式处理;如果是负数,按照ROUND_DOWN模式处理。这种模式的处理都会使近似值大于等于实际值。即向上取整。
- BigDecimal.ROUND_FLOOR:与ROUND_CEILING模式相反。即向下取整。
- BigDecimal.ROUND_HALF_DOWN:向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
- BigDecimal.ROUND_HALF_UP:向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。
- BigDecimal.ROUND_HALF_EVEN:如果商的倒数第二位为奇数,则按照ROUND_HALF_UP处理;如果为偶数,则按照ROUND_HALF_DOWN处理。
-
举例:
public class BigDecimalMethod { static final int location = 10;//保留小数位数 /** * 定义加法方法,参数为加数与被加数 * @param value1 相加的第一个数 * @param value2 相加的第二个数 * @return 两数之和 */ public BigDecimal add(double value1, double value2){ //实例化Decimal对象 BigDecimal bd1 = new BigDecimal(Double.toString(value1)); BigDecimal bd2 = new BigDecimal(Double.toString(value2)); return bd1.add(bd2);//调用加法方法 } /** * 定义减法方法,参数为减数与被减数 * @param value1 被减数 * @param value2 减数 * @return 两数之差 */ public BigDecimal sub(double value1, double value2){ BigDecimal bd1 = new BigDecimal(Double.toString(value1)); BigDecimal bd2 = new BigDecimal(Double.toString(value2)); return bd1.subtract(bd2);//调用减法方法 } /** * 定义乘法方法,参数为乘数为被乘数 * @param value1 第一个乘数 * @param value2 第二个乘数 * @return 相乘结果 */ public BigDecimal mul(double value1, double value2){ BigDecimal bd1 = new BigDecimal(Double.toString(value1)); BigDecimal bd2 = new BigDecimal(Double.toString(value2)); return bd1.multiply(bd2);//调用乘法方法 } /** * 定义除法方法 * @param value1 除数 * @param value2 被除数 * @param b 商小数点后的位数 * @return 相除的结果 */ public BigDecimal div(double value1, double value2, int b){ if (b < 0) { System.out.println("保留小数位值必须大于等于0"); } BigDecimal bd1 = new BigDecimal(Double.toString(value1)); BigDecimal bd2 = new BigDecimal(Double.toString(value2)); return bd1.divide(bd2, b, BigDecimal.ROUND_HALF_UP); } /** * 定义除法方法 * @param value1 除数 * @param value2 被除数 * @return 相除的结果 */ public BigDecimal div(double value1, double value2){ return div(value1, value2, location); } public static void main(String[] args) { BigDecimalMethod bdm = new BigDecimalMethod(); System.out.println("两个数字相加结果:"+bdm.add(-7.5, 8.9)); System.out.println("两个数字相减结果:"+bdm.sub(-7.5, 8.9)); System.out.println("两个数字相乘结果:"+bdm.mul(-7.5, 8.9)); System.out.println("两个数字相除结果,结果小数后保留10位:"+bdm.div(10, 2)); System.out.println("两个数字相除结果,结果小数后保留5位:"+bdm.div(-7.5, 8.9, 5)); } } //执行结果 两个数字相加结果:1.4 两个数字相减结果:-16.4 两个数字相乘结果:-66.75 两个数字相除结果,结果小数后保留10位:5.0000000000 两个数字相除结果,结果小数后保留5位:-0.84270
22.6 作业
- 猜数字(提示:产生随机数 Math.random()*(上限-下限+1)+下限):编写程序Guess,随机地产生一个整数,表示从A到Z的字母。之后,通过命令行参数读入一个整数,试图猜出随机产生的字母。无论猜得是否正确,都打印出相应的信息。另外,如果猜对了,程序退出。
- 利用Random类,随机生成一个int 随机数,long随机数,float随机数,double随机数,高斯随机数, 并在屏幕上随机打印.
- 使用Random类模拟摇色子游戏.共5粒色子,分别显示出5粒色子的点数,和加起来一共是多少点.打印输出.
- 模拟张新发扫码得红包系统(使用随机数与格式化小数实现):
- 没中奖 30%
- 中奖 0.1-1块钱 20%
- 中奖 1-3块钱 20%
- 中奖 3-10块钱 10%
- 中奖 10-18块钱 5%
- 中奖 18-28块钱 5%
- 中奖 28-38块钱 5%
- 中奖 38-58块钱 3%
- 中奖 88块钱 1%
生随机数 Math.random()*(上限-下限+1)+下限):编写程序Guess,随机地产生一个整数,表示从A到Z的字母。之后,通过命令行参数读入一个整数,试图猜出随机产生的字母。无论猜得是否正确,都打印出相应的信息。另外,如果猜对了,程序退出。
- 利用Random类,随机生成一个int 随机数,long随机数,float随机数,double随机数,高斯随机数, 并在屏幕上随机打印.
- 使用Random类模拟摇色子游戏.共5粒色子,分别显示出5粒色子的点数,和加起来一共是多少点.打印输出.
- 模拟张新发扫码得红包系统(使用随机数与格式化小数实现):
- 没中奖 30%
- 中奖 0.1-1块钱 20%
- 中奖 1-3块钱 20%
- 中奖 3-10块钱 10%
- 中奖 10-18块钱 5%
- 中奖 18-28块钱 5%
- 中奖 28-38块钱 5%
- 中奖 38-58块钱 3%
- 中奖 88块钱 1%
- 中奖 188块钱 0.1%