首页 > 其他分享 >数字迷惑行为

数字迷惑行为

时间:2023-08-04 23:33:23浏览次数:57  
标签:fastjson scale 数字 double toString 迷惑 行为 BigDecimal

最近做处理金额的业务比较多,所以最近遇到两个关于数字的坑,记下来以便以后不犯这种错误

1.0.57*100=?

问题代码:  

相信大多数人阅读上面这段代码都认为结果是57,但是运行结果却是56 问题原因: 计算机存储数字采用的是二进制,0.57在计算机中存储的二进制再转化成十进制的值是0.56999…,再乘100取整就是56。 解决办法:  

先转化成String类型再用BigDecimal进行运算。BigDecimal中有记录有效数字长度的precision、记录小数点位置的scale以及有效数字intCompact。如果不转化成String,BigDecimal不会记录小数位和长度这些信息,计算时还是会像第一次那样进行数字的普通计算  

2.FastJson处理double类型

问题代码:  

其实结果倒是没错,但是问题在于一个使用科学技术法一个没有使用,这如果传给前端,客户肯定会反馈数字风格不一致的问题 问题原因: 使用fastjson将json字符串反序列化成Map对象时,如果属性值是double类型,那么fastjson会默认当成BigDecimal来处理,相当于fastjson会调用new BigDecimal(String.valueOf(d1).toCharArray(), 0, String.valueOf(d1).length(), MathContext.UNLIMITED);来创建一个BigDecimal对象,然后println方法会默认调用对象的toString方法,BigDecimal的toString中会判断上文中提到的scale属性,如果scale属性是0(小数位的长度为0)则直接调用Long.toString(val),如果scale属性小于0(小数位的长度为负数,也就是说数字是整数,并且最后一位或者最后几位是0,最后面有几个0,scale就是负几)那么在toString方法中就会以科学记数的法表示 解决办法:  

使用toPlainString替代toString,toPlainString会使用数字的默认展示方式,而不是科学记数法。   注:本人使用的是1.2.83版本的fastjson,这版本的是将double转化成BigDecimal。

但是在最新版的fastjson中,是没有转化,double类型还是double类型。

所以以上代码就会变成这样:

 如果想直接输出普通的数字,可以直接使用new BigDecimal(double val);这个构造方法构造出的BigDecimal对象,直接使用toString就是普通的数字

标签:fastjson,scale,数字,double,toString,迷惑,行为,BigDecimal
From: https://www.cnblogs.com/lrxsznbe/p/17607291.html

相关文章

  • 检测、跟踪、行为识别All-In-One!产业级行人分析系统重磅开源!
    行人检测、行为分析、跨镜跟踪、属性识别等能力在工业、安防、金融、能源等行业中可谓是核心财富密码!一套综合目标检测、跟踪、关键点检测等能力的开源实时行人分析工具,就是把握这些高价值场景的关键!PP-Human多功能全景图说来容易,但它真的切实可用,需要企业真实场景数据打磨优化,拥有......
  • js中将数字格式化成内存的形式
    constformatSize=(size)=>{if(size<1024){returnsize+"b";}elseif(size<1024*1024){return(size/1024).toFixed(2)+"KB";}elseif(size<1024*1024*1024){retur......
  • Java获取字符串中首次出现非数字的位置
    /***获取字符串中首次出现非数字的位置*@paramvalue字符串内容*@return首次出现非数字的位置,若无非数字,则返回-1*/publicstaticintgetFirstNonDigitPosInString(Stringvalue){intfirstNonDigitPos=-1;if(TextUtils.i......
  • 嵌入式与物联网:连接现实与数字世界的纽带
    随着科技的发展和智能化的进程,嵌入式系统和物联网技术逐渐融入到我们的日常生活中,成为连接现实世界和数字世界的重要纽带。本文将探讨嵌入式系统与物联网之间的关系,并通过关系图展示二者的紧密联系。一、嵌入式系统的基本概念嵌入式系统是一种特殊的计算机系统,通常被嵌入到其他设备......
  • 建管家承办建企数字化论坛,持续发力推动产业发展升级
     8月23日至25日,由中国施工企业管理协会主办的“第八届工程建设行业互联网大会”即将启幕。本届大会期间,由建管家承办的“数变·建新——大数据赋能建企全生命周期数字化升级专题论坛”也将正式召开,建管家将携大数据赋能建工企业高质量发展成果、行业大数据白皮书重磅亮相,并同时......
  • 数字孪生助力防台风抗灾
    随着夏日的脚步临近,台风季节即将降临。对于那些居住在沿海地区的人们来说,台风是一种常见的自然灾害,其带来的风雨可能对生命和财产造成严重威胁。然而,随着数字科技的飞速发展,可视化技术为防汛抗台工作带来了全新的可能性。 智慧防台,数字化保障智慧防台,是数字科技在台风防汛领域......
  • 如果用机器学习的理论来理解人的行为,会有什么发现?
    以前有人问我“书读了很多之后,但是其中内容都忘记了,那么读书的价值何在呢?”我说:“训练数据在训练完模型之后就可以删掉了,只要权值文件和网络结构保存好即可” 死记硬背是没有用的,因为死记硬背是一种过拟合的能力,而一个好的机器学习模型应该是泛化性能比较好的,所以好的教育应......
  • 剑指 Offer 11. 旋转数组的最小数字(简单)
    题目:classSolution{public:intminArray(vector<int>&numbers){intresult=numbers[0];//当旋转0个元素时第一个元素就是最小值if(numbers.size()==1)returnresult;for(inti=1;i<numbers.size();i++){//通过观......
  • Golang 使用 JSON unmarshal 数字到 interface{} 数字变成 float64 类型
    最近在golang业务开发时,遇到一个坑。我们有个服务,会接收通用的interface对象,然后去给用户发消息。因此会涉及到把各个业务方传递过来的字符串,转成interface对象。但是因为我的字符串里有一个数字,比如下面demo里的{"number":1234567},而且数字是7位数,在经过json.Unmarshal后,被转成......
  • java输出字符和数字
    1、用java如何输出一个字符串中的所有数字?2、使用java语言编写程序,统计从控制台输入的一行字符串中数字个数、字母...3、java中怎么将字符串中的数字取出来4、JAVA怎样快速把字符串里面的数字取出来用java如何输出一个字符串中的所有数字?数字的ascii码是48-57共10个。......