求大神,在线求救啊

解决方案 »

  1.   

    是考题还是啥?一般来说用 BigDecimal 就差不多了。否则就要自己写程序来模拟逐位运算了。
      

  2.   

    BigDecimal就可以实现,具体BigDecimal的可以查阅API文档;public class BigDecimalextends Numberimplements Comparable<BigDecimal>不可变的、任意精度的有符号十进制数。BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负 scale 次幂。因此,BigDecimal 表示的数值是 (unscaledValue × 10-scale)。 BigDecimal 类提供以下操作:算术、标度操作、舍入、比较、哈希算法和格式转换。toString() 方法提供 BigDecimal 的规范表示形式。 BigDecimal 类使用户能完全控制舍入行为。如果未指定舍入模式,并且无法表示准确结果,则抛出一个异常;否则,通过向该操作提供适当的 MathContext 对象,可以对已选择的精度和舍入模式执行计算。在任何情况下,可以为舍入控制提供八种舍入模式。使用此类(例如,ROUND_HALF_UP)中的整数字段来表示舍入模式已过时;应改为使用 RoundingMode enum(例如,RoundingMode.HALF_UP)的枚举值。 当为 MathContext 对象提供 0 的精度设置(例如,MathContext.UNLIMITED)时,算术运算是准确的,它们是不采用任何 MathContext 对象的算术方法。(这是第 5 版之前的版本支持的唯一行为。)为了计算准确结果,不使用附带 0 精度设置的 MathContext 对象的舍入模式设置,因此与该对象无关。在除法中,准确的商可能是一个无限长的十进制扩展;例如,1 除以 3 所得的商。如果商具有无穷的十进制扩展,但是指定了该操作返回准确结果,则抛出 ArithmeticException。否则,像其他操作那样,返回除法运算的准确结果。 当精度设置不为 0 时,BigDecimal 算法的规则完全符合 ANSI X3.274-1996 和 ANSI X3.274-1996/AM 1-2000( 7.4 节)中定义的算法的可选操作模式。与上述标准不同,BigDecimal 包括多种舍入模式,它们对于版本 5 以前的 BigDecimal 版本中的除法是强制性的。这些 ANSI 标准和 BigDecimal 规范之间的任何冲突都按照有利于 BigDecimal 的方式进行解决。 由于同一数值可以有不同的表示形式(具有不同的标度),因此运算和舍入的规则必须同时指定数值结果和结果表示形式中所用的标度。 一般情况下,当准确结果(在除法中,可能有无限多位)比返回的数值具有更多位数时,舍入模式和精度设置确定操作如何返回具有有限位数的结果。 首先,MathContext 的 precision 设置指定要返回的总位数;这确定了结果的精度。位数计数从准确结果的最左边的非零数字开始。舍入模式确定丢弃的尾部位数如何影响返回的结果。 对于所有算术运算符,运算的执行方式是,首先计算准确的中间结果,然后,使用选择的舍入模式将其舍入为精度设置(如有必要)指定的位数。如果不返回准确结果,则将丢弃准确结果的某些数位。当舍入增加了返回结果的大小时,前导数字“9”的进位传播可能会创建新的数位。例如,将值 999.9 舍入为三位数字,则在数值上等于一千,表示为 100×101。在这种情况下,新的 "1" 是返回结果的前导数位。 除了逻辑的准确结果外,每种算术运算都有一个表示结果的首选标度。下表列出了每个运算的首选标度。 算术运算结果的首选标度  运算 结果的首选标度 
    加 max(addend.scale(), augend.scale()) 
    减 max(minuend.scale(), subtrahend.scale()) 
    乘 multiplier.scale() + multiplicand.scale() 
    除 dividend.scale() - divisor.scale() 
    这些标度是返回准确算术结果的方法使用的标度;准确相除可能必须使用较大的标度除外,因为准确的结果可能有较多的位数。例如,1/32 得到 0.03125。 舍入之前,逻辑的准确中间结果的标度是该运算的首选标度。如果用 precision 位数无法表示准确的数值结果,则舍入会选择要返回的一组数字,并将该结果的标度从中间结果的标度减小到可以表示实际返回的 precision 位数的最小标度。如果准确结果可以使用最多 precision 个数字表示,则返回具有最接近首选标度的标度的结果表示形式。尤其是,通过移除结尾零并减少标度,可以用少于 precision 个数字来表示准确的可表示的商。例如,使用 floor 舍入模式将结果舍入为三个数字,
    19/100 = 0.19 // integer=19, scale=2 
    但是
    21/110 = 0.190 // integer=190, scale=3 
    注意,对于加、减和乘,标度的缩减量将等于丢弃的准确结果的数字位置数。如果舍入导致进位传播创建一个新的高位,则当未创建新的数位时,会丢弃该结果的附加数字。 其他方法可能与舍入语义稍微不同。例如,使用指定的算法的 pow 方法得到的结果可能偶尔不同于舍入得到的算术结果,如最后一位有多个单位(ulp)。 可以通过两种类型的操作来处理 BigDecimal 的标度:标度/舍入操作和小数点移动操作。标度/舍入操作(setScale 和 round)返回 BigDecimal,其值近似地(或精确地)等于操作数的值,但是其标度或精度是指定的值;即:它们会增加或减少对其值具有最小影响的存储数的精度。小数点移动操作(movePointLeft 和 movePointRight)返回从操作数创建的 BigDecimal,创建的方法是按指定方向将小数点移动一个指定距离。 为了简洁明了起见,整个 BigDecimal 方法的描述中都使用了伪代码。伪代码表达式 (i + j) 是“其值为 BigDecimal i 加 BigDecimal j 的 BigDecimal”的简写。伪代码表达式 (i == j) 是“当且仅当 BigDecimal i 表示与 BigDecimal j 相同的值时,则为 true”的简写。可以类似地解释其他伪代码表达式。方括号用于表示特定的 BigInteger 和定义 BigDecimal 值的标度对;例如,[19, 2] 表示 BigDecimal 在数值上等于 0.19,标度是 2。 注:如果 BigDecimal 对象用作 SortedMap 中的键或 SortedSet 中的元素,则应特别小心,因为 BigDecimal 的自然排序与 equals 方法不一致。有关更多信息,请参见 Comparable、SortedMap 或 SortedSet。 当为任何输入参数传递 null 对象引用时,此类的所有方法和构造方法都将抛出 NullPointerException。 
      

  3.   

    具体 实现的代码!!!
    import java.math.BigDecimal;class Multiply
    {
     public static double mul(double d1, double d2)
    {        // 进行乘法运算
             BigDecimal b1 = new BigDecimal(d1);
             BigDecimal b2 = new BigDecimal(d2);
            return b1.multiply(b2).doubleValue();
         }
    public static double round(double d,
    int len)
    {    
            // 进行四舍五入操作         BigDecimal b1 = new BigDecimal(d);
             BigDecimal b2 = new BigDecimal(1);
            // 任何一个数字除以1都是原数字
            // ROUND_HALF_UP是BigDecimal的一个常量,        return b1.divide(b2, len,BigDecimal.
    ROUND_HALF_UP).doubleValue();
         }}
    public class  TestMultiply
    {
    public static void main(String [] args)
    {
    System.out.println("乘法运算:" +
    Multiply.round(Multiply.mul(10.345,
    3.333), 3));}
    }
      

  4.   

    ab.java:27: 错误:类TestMultiply是公共的,应在名为TestMultiply.java的文件中声明。
    程序编译时报错,我刚学JAVA,请7楼改一下
      

  5.   


    import java.util.ArrayList;
    import java.util.List;public class TimesTest { public static void main(String[] args) {
    String s1 = "123456789";
    String s2 = "123456789";
    String result = multiplyStringByString(s1, s2);
    System.out.println(result);
    } /**
     * 获取两个字符串的乘积
     * @param s1 String
     * @param s2 String
     * @return String
     */
    public static String multiplyStringByString(String s1, String s2) {
    List<Integer> resultList = null;
    for (int i = s1.length() - 1, j = 0; i >= 0; i--, j++) {
    char c = s1.charAt(i);
    List<Integer> numList = multiplyCharByString(c, s2);
    resultList = SumOfTwoList(resultList, numList, j);
    }
    StringBuffer sb = new StringBuffer();
    for (int i = resultList.size() - 1; i >= 0; i--) {
    sb.append(resultList.get(i));
    }
    return sb.toString();
    } /**
     * 计算两个数组的和
     * 
     * @param resultList
     *            存放结果的数组
     * @param numList
     *            待加数组
     * @param bit
     *            从第几位开始加
     * @return List<Integer>
     */
    public static List<Integer> SumOfTwoList(List<Integer> resultList,
    List<Integer> numList, int bit) {
    if (resultList == null) {
    return numList;
    }
    for (int i = 0, j = bit; i < numList.size(); i++, j++) {
    if (j < resultList.size()) {
    resultList.set(j, resultList.get(j) + numList.get(i));
    } else {
    resultList.add(numList.get(i));
    }
    }
    carryBit(resultList);
    return resultList;
    } /**
     * 获取字符串乘以字符的结果
     * 
     * @param c
     *            char
     * @param s
     *            String
     * @return String
     */
    public static List<Integer> multiplyCharByString(char c, String s) {
    int[] integers = convertStringToInteger(s);
    int num = convertCharToInteger(c);
    List<Integer> resultList = new ArrayList<Integer>();
    for (int i = integers.length - 1; i >= 0; i--) {
    int result = num * integers[i];
    resultList.add(result);
    }
    carryBit(resultList);
    return resultList;
    } /**
     * 进位
     * 
     * @param resultList
     *            List<Integer>
     */
    private static void carryBit(List<Integer> resultList) {
    for (int i = 0; i < resultList.size(); i++) {
    int result = resultList.get(i);
    if (result / 10 > 0) {
    resultList.set(i, result % 10);
    if (resultList.size() > i + 1) {
    resultList.set(i + 1, resultList.get(i + 1) + result / 10);
    } else {
    resultList.add(result / 10);
    }
    }
    }
    } /**
     * 将字符串转换为整形数组
     * 
     * @param s
     *            String
     * @return int[]
     */
    public static int[] convertStringToInteger(String s) {
    int[] integers = new int[s.length()];
    for (int i = 0; i < s.length(); i++) {
    integers[i] = convertCharToInteger(s.charAt(i));
    }
    return integers;
    } /**
     * 将字符转换成整数
     * 
     * @param c
     *            char
     * @return int
     */
    public static int convertCharToInteger(char c) {
    return (int) (c) - 48;
    }
    }求两个字符串的乘积,写的乱点...