VB单精度、双精度浮点数误差,如何消除

VB单精度、双精度浮点数误差,如何消除,第1张

浮点数的存在是完全有必要、不可或缺的。电脑由于设计上的特点,它是不可能精确储存一个无限小数(比如说圆周率)的,否则的话一台电脑上的全部内存空间都不够用来储存一个数字!因此,电脑就用浮点数来近似表示一个实数,其中单精度浮点数(Single)占用4个字节,可表示7位有效数字(比如说圆周率用Single型表示就是3141593),双精度浮点数(Double)占用8个字节,可表示15位有效数字(圆周率的Double型值为314159265358979)。正因为它是“近似值”,所以浮点数的运算难免会产生误差,这个是不可避免的,而且这也不是VB的“罪”,在所有程序设计语言中都是存在的(当然,不同的语言可能有不同的规避措施,VB也许在这方面做得不够好)。

货币型(占用8个字节)是一种特殊的数据类型,它看起来像浮点数(因为可带小数),但其实它是定点数(因为它的小数位是固定4位的)。它在运算时会先把自己转换为整数(小数点右移4位),运算后再转为小数(小数点左移4位),所以它的运算是精确运算,不存在浮点误差的问题。但是,由于货币的特殊性,货币型只能有4位小数,因此当小数位超过4位时就不适合用货币型了。

体型属于“万金油”数据类型,可接受任何数据类型,而且它会自动根据数值的特点自动选择适合的数据类型参与运算,如果数值不含小数,它会自动按整数处理;如果数值所含小数不多于4位,它会按货币型处理(这就是为什么你的程序用变体型不会产生误差的原因);如果小数位大于4,就按浮点数处理(也就是说你的程序处理的数据如果大于4位小数,用变体型一样会产生误差的)。但是,变体型属于VB的“畸形产物”(其他高级语言中是没有这样的类型的),除了刚入门的初学者,一般不建议使用变体型。因为变体型为了适应各种数据类型,它要占用16个字节的内存空间(也就是说一个变体型变量即使值为0,它也要占用16个字节),这会严重浪费宝贵的系统资源,严重影响程序的运行效率,而且有可能会产生一些意料之外的错误(这里就不赘述了)。所以,千万不要以为变体型简单、好用,一个程序中如果大量使用变体型变量,那么可以肯定的是,这个程序会显得非常业余,一点也不专业!

综上所述,使用浮点数并不是因为它“准确”,而是当你处理的数据含有小数(尤其是大于4位的小数)时,你只能选择浮点数来计算了,别无选择!其次,浮点运算误差是不可避免的,只能通过其他措施尽量减小误差的影响。此外,变体型并不是一种独立的数据类型,它会根据需要自动转为整数、货币型、浮点数等,所以所谓“变体型不如单双精度准确”之类的提法也是错误的。

这跟double的精度有关系。double的精度是15位,超过后就加不上了。

例:123456789012341+001=123456789012341大于精度的会被忽略。

程序运行是有一个确定性的,造成不确定的因素可能是一些其它的 *** 作造成的。可以单独进行步进 *** 作,如果还出现问题就是系统问题了。否则就是程序问题。

看到中文 有种真没看过 哈哈

原因是因为java 的double类型数据是不精准的

实际开发会用下面api 提供的类

Java在javamath包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用javamathBigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是

BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。

BigDecimal bigLoanAmount = new BigDecimal("具体数值"); //创建BigDecimal对象

BigDecimal bigInterestRate = new BigDecimal("具体数值");

BigDecimal bigInterest = bigLoanAmountmultiply(bigInterestRate); //BigDecimal运算

NumberFormat currency = NumberFormatgetCurrencyInstance(); //建立货币格式化引用

NumberFormat percent = NumberFormatgetPercentInstance(); //建立百分比格式化用

percentsetMaximumFractionDigits(3); //百分比小数点最多3位

//利用BigDecimal对象作为参数在format()中调用货币和百分比格式化

Systemoutprintln("Loan amount:\t" + currencyformat(bigLoanAmount));

Systemoutprintln("Interest rate:\t" + percentformat(bigInterestRate));

Systemoutprintln("Interest:\t" + currencyformat(bigInterest));

输出结果

Loan amount: ¥129,876,534,219,876,52312

Interest rate: 8765%

Interest: ¥11,384,239,549,149,66169

以上就是关于VB单精度、双精度浮点数误差,如何消除全部的内容,包括:VB单精度、双精度浮点数误差,如何消除、double浮点数精度,引起的异常问题、JAVA程序计算结果出错等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9521379.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存