详细的SQL保留小数点和遇到的坑(四舍五入/非四舍五入)

本文详细介绍了C#中字符串处理与数学运算的高级技巧,包括如何使用Substring截取字符串,不同方式连接字符串,以及如何进行精确的四舍五入和非四舍五入运算。还探讨了StringBuilder和String.Format的优缺点,并提供了自定义保留小数位数的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

首先,明确概念,数字也是字符的一种。字符类型,特别是NVarchar类型强大到可以直接或者间接的转换成任一类型(前提转换内容准确,毕竟不可能把字母‘a‘转换成‘1111’)。

主要关键词

截取字符串主要使用关键词substring()

substring() 方法返回一个字符串在开始索引到结束索引之间的一

个子集, 或从开始索引直到字符串的末尾的一个子集

连接字符串可以使用 “+”、StringBuilder.Append和String.Format。
其中string是引用类型,保留在堆上,用的时候传的是内存中的地址,每次修改就会重新创建一个新的string对象来存储字符串,原有的会被自动回收。StringBuilder.Append和String.Format本质但是使用StringBuilder可变字符序列


StringBuilder str = new StringBuilder("123");
str.Append("abc");
string str= String.Format("{0}{1}{2}","a","b","c");

貌似在后面的C#版本和VS2015以上,可以使用$代替string.format();

四舍五入

Math.round( a, n );n决定保留位数
a.ToString(“fn”);n决定保留位数
String.Format(“{0:Nn}”,a);n决定保留位数
a.ToString(“#0.000”);n决定保留位数
Decimal.Round(a,n) ;n决定保留位数

这里要注:因为大部分软件内核封装时候是按照四舍五入进行封装的,所以常用的函数也都是四舍五入的

非四舍五入

要想非四舍五入常常要使用字符截取,常用的就是对时间进行字符截取保留到年月日

mode.CU_wcrq = ds1.Tables[0].Rows[0]["LastOperateTime"].ToString().Substring(0, 8);

上面这种只适合于位数确定的数字,如果数字变化就不再适用了。这时候可以取巧,使用除法/的取余数,即保留n位数就增大10 的n次方再除以10 的n次方

double test3 = Math.Truncate(test2 * 100) / 100;   

Math封装的几种函数

在.net中具有封装了Math的四种函数,即Math.Round向下舍入,Math.Ceiling向上舍入,Math.Truncate向下舍入为零。 因此,对于正数,Math.Truncate类似于Math.Floor,对于负数,类似于Math.Ceiling。
注意:使用上面的函数获得的结果并不一定是你所期望的

Math函数的坑
以Math.Truncate为例,我们先使用字符串test1获取Quantity的数值,再将字符串强转换成double类型,注意上面的数字,test1是2126.43000000,强转换把后面零去除得test2的值2126.43,保留两位小数,但是Math.Truncate向下取舍即第三位小数在0~4区间百分位小数进行减一操作,在5到9区间百分位保留原值。所以为了获取我们期望的值往往进行判断,在非四舍五入下保留期望位数。
注意:在double类型下的加减将更加精确,小数位数更多,不在是简单的加减法。

扩展

除了调用方法之外,我们还可以自己写保留位数方法

public static String calculateProfit(double doubleValue) {
        // 保留4位小数,非四舍五入
        DecimalFormat df = new DecimalFormat("0.0000");
        String result = df.format(doubleValue);
        // 获取小数 . 号第一次出现的位置
        int inde = firstIndexOf(result, ".");
        // 字符串截断
        return result.substring(0, inde + 3);
    }
public static String formatDouble(String value) {
	   	 DecimalFormat    df   = new DecimalFormat("#0.00");  
	   	 String st=df.format(Double.valueOf(value));		//四舍五入
	   	 return st;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值