浮点数按实际位数格式化显示的方法

来源:互联网 发布:windows safari 编辑:程序博客网 时间:2024/06/05 10:54

      我们在开发与科学计算相关的应用程序时,通常需要处理浮点数的显示问题。但由于IEEE754浮点数标准所固有的精度问题,给很多的情况下对于浮点数的格式化显示问题带来了困难。以下是一些与浮点数相关的使用情境中所常见的问题:

 

1、数据库中存储的某双精度浮点数2.02,通过程序读出后表示为2.0200000000000000,将该浮点数格式化显示到数据表现控件(如MSFlexgrid或者其他第三方grid控件)上时,如果不控制小数点后的位数,那么显示出来的数据形式不仅很不美观,也影响到用户的阅读和使用,而如果控制小数点的位数,那么到底是保留小数点后几位呢?通常的情况是难以准确确定小数点应该保留的位数,最好的情况是“原来的数字有几位小数就显示几位”;

 

2、有些双精度浮点数从数据库中读出后,并不是出现像1中所表示的那样,在有效数字后面加上若干多余的“0”,而是表示为多个“9”的形式,如浮点数2.3,某些情况下表示为2.2999999999999998。此时的数字表示与实现的值就存在误差了,并不是像1中那样简单的去除多余的0即可;

 

3、在某些Grid类的表格控件中,当用户输入一个浮点数,如“21.25”时,通过数据绑定的方式,需要再次将该数据显示到前台来,而往往此时再次显示时则变为“21.2500000000000000”了,或者是存在误差的形式如“21.2499999999999998”。此时更有理由需要能够有一种办法显示输入的浮点数的真实小数位数。

 

      分析以上的使用情境,有一个共同的需求就是希望找到一种浮点数格式化显示的方法,使得能够显示浮点数的小数点后的真实位数,不固定小数点后的保留位数,不显示多余的0。本文提出一种实用的浮点数格式化显示方法,能够保证绝大多数情况下的使用需求。

 

     我们知道在C/C++的字符串格式显示的几个函数(printf、sprintf、CString::Format……)中,可以通过传递“%g”来格式化字符串,使用“%g”的具体含义是“自动使用%e和%f两者中格式化后位数最短的形式来转换显示”。其具体的含义和作用,以及使用的方法如下:

 

1、当传入的浮点数的有效数字不超过6位时,使用“%g”能够有效的去除浮点数显示时小数点后面多余的0,并且当因误差而出现多个“9”的形式时,能够自动进位,得到与实际的浮点数一致的显示效果;

 

2、当传入的浮点数的有效数字超过6位时,自动将数据显示为科学计数的形式,即使用“%e”的格式化形式;

 

      综合以上两点,提出一种基于整数部分与小数部分相分离的方法来实现按实际位数格式化显示浮点数的。代码如下:

 

 

    这种方法将整数部分独立开来,单独处理小数点后的小数部分,当小数点后的小数位数不超过6位时,使用这种方法均能够准确的显示实现的浮点数数值,即能够真正做到按实际位数显示浮点数。这对于绝大多数的科学计算应用都是能够接受的。

 

原创粉丝点击