C_BigDecimal_加减运算

首先举个例子说说思路:

输入str1:1.341   str2:11.2  在C语言中存储字符串的直接是字符型数组,strlen(str)代表字符串的长度(那个小数点也要算的),则str1,str2的长度为5和4。而浮点数加减运算时遵循从右往左计算,所以首先要使得字符串格式化。找到并返回存储字符串中小数点的下标,str1,str2小数点位置下标为1和2,然后用字符串长度减去即可求出小数点后的位数差,通过循环将短的加0补齐,为1.341,11.200,最后按最长长度循环将字符从右依次赋值给自定的c1,c2,先转成数计算再转换成字符存到结果数组中(注意进位)。

找小数点的方法

int findPoint(char *str)         //寻找字符串的点的位置并返回 
{
    int i,pPos;
    for(i=0;i<strlen(str);i++)
    {
     if(str[i]=='.')
         pPos=i;
    }
    return pPos;
}

用0补齐字符串小数后的位数的方法

//前提是已经通过交换将小数点后位数多的字符串赋给str1,现在只补齐str2
void formal(int len1,int len2,char *str1,char *str2)
{
    int i;
    int difNum=(len1-findPoint(str1))-(len2-findPoint(str2));   
    for(i=0;i<difNum;i++)
    {
        str2[i+len2]='0';
    }
    len2=len2+difNum;
} 

加运算方法,编译时只需输入字符串再调用

void Add(char *result,char *str1,char *str2)
{
    int i,len1,len2,c;
    if(strlen(str1)<strlen(str2))
    {
         exChange(str1,str2);
    }
    int x=0;                //进位值,初始为0
    char c1,c2;
    len1=strlen(str1);
    len2=strlen(str2);

    c=len1;            

    *(result+c+1)='\0';        //添加字符串结束标志
   formal(len1,len2,str1,str2); 

   for(i=0;i<=c;i++)    //由后往前计算result对各位的值,直到得出*result的值
    {    
        if(len1-1<i)
             c1='0';    
        else
             c1=*(str1+ len1-1 -i);    //将str1的各位依次赋给c1,下同
        if(len2-1<i) 
             c2='0';
        else 
             c2=*(str2+ len2-1 -i);                     
                    //计算对应位
        *(result+c-i) = (c1-'0'+c2-'0'+x)%10+'0';
        x=(c1-'0'+c2-'0'+x) / 10 ;
    }

    if(*result=='0')            //如果result的第一位为'0',则去掉该位
    {                
        for(i=0;*(result+i);i++)
            *(result+i)=*(result+i+1);
    }
    printf("result:%s\n",result); 
}

会了加法运算,减法运算就简单了,同样的方法先补0向右对齐,然后通过比较小数点的位置来判断大小,将绝对值大的赋给str1,最后和加法的依次赋值进行操作的方法一样,只是考虑了一下借位的值。

我的编程能力很菜,但在改进中,希望看过的各路大侠多提意见,谢谢。

 

转载于:https://www.cnblogs.com/saraline/p/4844557.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用BigDecimal进行加减乘除运算时,可以使用setScale方法设置保留小数位数。例如: BigDecimal a = new BigDecimal("1.2345"); BigDecimal b = new BigDecimal("2.3456"); // 加法 BigDecimal c = a.add(b).setScale(2, BigDecimal.ROUND_HALF_UP); // 减法 BigDecimal d = a.subtract(b).setScale(2, BigDecimal.ROUND_HALF_UP); // 乘法 BigDecimal e = a.multiply(b).setScale(2, BigDecimal.ROUND_HALF_UP); // 除法 BigDecimal f = a.divide(b, 2, BigDecimal.ROUND_HALF_UP); 其中,setScale方法的第一个参数表示保留小数位数,第二个参数表示舍入模式。ROUND_HALF_UP表示四舍五入。 ### 回答2: Bigdecimal是在计算机科学中非常重要的一个类,可以处理高精度的十进制小数,它的精度可以达到几百位甚至上千位,而且不会产生精度误差。在进行加减乘除运算时,也需要注意保留小数点后几位,避免出现误差。 在Java中,我们可以使用Bigdecimal类来进行高精度计算。要想对Bigdecimal进行加减乘除运算并保留两位小数,可以采用如下步骤: 1. 创建Bigdecimal对象,设置初始值。 例如: BigDecimal a = new BigDecimal("1.235"); 2. 进行加减乘除运算,使用相应的方法。 例如: BigDecimal b = new BigDecimal("2.345"); BigDecimal c = a.add(b); // 加法运算 BigDecimal d = a.subtract(b); // 减法运算 BigDecimal e = a.multiply(b); // 乘法运算 BigDecimal f = a.divide(b, 2, BigDecimal.ROUND_HALF_UP); // 除法运算,保留两位小数 3. 使用setScale()方法设置保留小数点后几位数。 例如: BigDecimal g = new BigDecimal("3.14"); BigDecimal h = g.setScale(2, BigDecimal.ROUND_HALF_UP); // 保留两位小数 以上就是Bigdecimal加减乘除运算并保留两位小数的方法。需要注意的是,在进行除法运算时,我们需要指定保留小数点后的位数和舍入方式。BigDecimal提供了多种舍入方式,其中ROUND_HALF_UP舍入模式可以保证四舍五入。保留小数点后几位数的设置,可以使用setScale()方法来实现。 ### 回答3: BigDecimal是Java平台提供的高精度计算类,它可以用于对超出Java原生数据类型表示范围的数字进行运算BigDecimal加减乘除运算可以使用其提供的方法,例如add()、subtract()、multiply()和divide()等。在进行这些运算时,需要指定运算过程中要用到的位数,特别是小数点后的位数,以保证结果的精度和正确性。 在进行BigDecimal运算时,为了保留两位小数,可以使用setScale()方法设置小数点后的位数。如下所示: BigDecimal a = new BigDecimal("3.1415926"); BigDecimal b = new BigDecimal("2.718"); BigDecimal result = a.divide(b, 2, RoundingMode.HALF_UP); 在上述示例中,a和b都是BigDecimal类型的数字,其中a表示圆周率π,b表示自然常数e。使用divide()方法计算a与b的商,在设置小数点后保留两位,并使用HALF_UP舍入模式将小数点后第三位四舍五入。最终,result表示π÷e的值,保留两位小数为1.15。 当进行多个BigDecimal加减乘除运算时,需要将结果赋值给新的BigDecimal对象,以避免因前一个运算的结果而引起的精度损失。同时,还需要注意BigDecimal对象的构造方法中需要传入字符串参数,而非double类型的数字,以避免精度丢失。 总之,通过使用BigDecimal类的add()、subtract()、multiply()和divide()方法,同时设置setScale()方法指定小数点后的位数,可以进行BigDecimal加减乘除运算,并保留指定位数的小数。这样可以确保结果的精确性和正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值