- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
float double精度丢失
float double精度丢失
ceil(float or double * 100) /100
floor(float or double * 100) /100
int是精确值类型,float是近似值类型。
int的取值范围是:-2^31 ~ 2^31 - 1,这里32位中第一位是符号位,剩下的31位是表示数值的。
而float的组成是:1位符号位+8位指数(q)+23位底数(b),其解释出来的形式是:b^q,由于指数q是8位有符号整数,范围是-128 ~ 127,23位的底数(无符号)最大值就是2 ^ 23,算上指数的话,最大可以表达到2 ^ 23 ^ 127,但是由于计算机的运算能力限制,并不能处理到如此大的数,但是其取值范围也会比32位整数大很多。
由于float类型是一个幂计算式,所以很多时候并不能表达一个精确值,例如0.1,如果使用float在内存中会被表示为0.10000000000000001,如果进行反复计算将会导致非常大的误差。
float本就是近似值,它不是精確值。
通俗點講float是有兩個值的,一個是Text,就是你在DB中看到的數字,如2.3,另一個則是Value,就是它真實的值,也就是2.299999999999.
所以在做四舍五入、精確的Report、比較(只能用、而不能用=)時請盡量避免使用float類型。建議使用Decimal類型或者Numeric類型。
如果LZ不想改變類型可以嘗試這樣,select convert(num as decimal(10,3)) from tb
double有时候也会出问题的。
int是精确值类型,float和double都是近似值类型。
Decimal 值类型表示从正 79,228,162,514,264,337,593,543,950,335 到负 79,228,162,514,264,337,593,543,950,335 之间的十进制数。Decimal 值类型适用于要求使用大量有效的整数及小数位数并且没有舍入错误的财务计算。
十进制数是由符号、数值和比例因子组成的浮点值,数值的每一位的范围都是 0 到 9,比例因子指示分隔数值的整数和小数部分的浮点小数点的位置。
ceil(float or double * 100)
floor(float or double * 100)
要避免这种写法
部分小数会丢失精度,因为像0.1,0.2,0.2,0.4,0.6,0.7,0.8,0.9………….乘以2到不了尽头,而整数永远不会丢精度,因为任何整数都可以用二进制表示
Java Float类型 减法运算时精度丢失问题
package test1;
public class Test2 {
/**
* @param args
*/
public static void main(String[] args) {
Float xx = 2.0f;
Float yy = 1.8f;
Float tt = xx - yy;
System.out.println(tttttt----- + tt);
}
}
果然输出结果是: tttttt-----0再测试了几个float类型的减法,除了*.0这样的相减没有异议之外,都存在这个问题,就是说float在相减的时候精度丢失了。后来在网上找到一段解决这个问题的办法,记在这里:
package test1;
import java.math.BigDecimal;
public class Test2 {
/**
* @param args
*/
public static void main(String[] args) {
Float xx = 2.2f;
Float yy = 2.0f;
Float tt = xx - yy;
BigDecimal b1 = new BigDecimal(Float.toString(xx));
BigDecimal b2 = new BigDecimal(Float.toString(yy));
float ss = b1.subtract(b2).floatValue();
System.out.println(ssss---- + ss);
System.out.println(tttttt----- + tt);
}
}
输出为:
ssss----0.2
tttttt-----0这样一对比,差异就很明显了。
解决了问题,再找了一下为什么会产生这种差异:
网上有篇文章写得很详细,标题为《剖析float型的内存存储和精度丢失问题》,全文内容如下:
问题提出:12.0f-11
您可能关注的文档
最近下载
- 温室大棚施工组织设计(包含道路)(实用资料).doc VIP
- 上海书法家协会书法9级理论考试.pdf VIP
- 三相大功率交错并联磁集成LLC谐振变换器的设计.doc VIP
- 华为中高层员工的述职方式、述职模型和8大述职内容!(纯干货).pdf VIP
- 中等职业学校高星级饭店运营与管理专业教学标准(教育部).docx VIP
- 了解社会主义核心价值观主题班会PPT课件.pptx VIP
- 自考00037美学复习资料.pdf VIP
- 销售竞业协议范本 .pdf VIP
- 中秋博饼游戏规则.doc VIP
- 2025中国中医科学院中医药健康产业研究所(江西中医药健康产业研究院)招聘事业编制人员备考练习试题及答案解析.docx VIP
文档评论(0)