TEL:服務(wù)熱線

400-006-2918

產(chǎn)品中心

新聞動(dòng)態(tài)

【青島德瑞鑫凈化工程面試真經(jīng)】(程序開(kāi)發(fā)崗)C++ float轉(zhuǎn)double會(huì)有精度損失嗎?

  • 瀏覽次數(shù): ...
  • 發(fā)布時(shí)間: 2023-09-01

float精度能保證6位有效,double保證15位有效。

一般認(rèn)為float轉(zhuǎn)double是不會(huì)丟失精度的,但是實(shí)際情況會(huì)丟失,如下代碼所示

 

$ cat main.c
#include <stdio.h>
int main(void) {
printf("%.100g\n%.100g\n%.100g\n%.100g\n", 25.0 * 3.14159, 25.0 * 3.14159f, 3.14159, 3.14159f);
return 0;
}
 
$ gcc main.c
$ ./a.out
78.539749999999997953636921010911464691162109375
78.539752960205078125
3.14158999999999988261834005243144929409027099609375
3.141590118408203125
 

出現(xiàn)這種結(jié)果的原因:讓一個(gè)float或double精確的表示0.1或者任何其他負(fù)數(shù)次方值是不可能的(十進(jìn)制系統(tǒng)中不能準(zhǔn)確的表示出1/3,同樣二進(jìn)制系統(tǒng)也不能準(zhǔn)確的表示1/10)。

 

1.十進(jìn)制整數(shù)轉(zhuǎn)為二進(jìn)制數(shù):

例子:11表示成二進(jìn)制數(shù):

11/2 =5 余1

5/2 = 2 余1

2/2 = 1 余0

1/2 = 0 余1

0結(jié)束,11二進(jìn)制表示為(從下往上):1011

注意:只要遇到除以后的結(jié)果為0就結(jié)束了。所有的整數(shù)除以2一定能夠最終得到0,但是小數(shù)就不能,小數(shù)轉(zhuǎn)變?yōu)槎M(jìn)制的算法就有可能會(huì)無(wú)限循環(huán)下去。

 

2.十進(jìn)制小數(shù)轉(zhuǎn)為二進(jìn)制數(shù)

算法是乘以2知道沒(méi)有了小數(shù)為止,例子:

0.9表示成二進(jìn)制數(shù):

0.9*2 = 1.8 取整數(shù)部分:1

0.8*2 = 1.6 取整數(shù)部分:1

0.6*2 = 1.2 取整數(shù):1

0.2*2 = 0.4 取整數(shù):0

0.4*2 = 0.8 取整數(shù):0

0.8*2 = 1.6 取整數(shù):1

 

0.9二進(jìn)制表示為(從上往下):1100100100100.......

注意:上面的計(jì)算過(guò)程循環(huán)了,也就是說(shuō)乘以2永遠(yuǎn)不能消滅小數(shù)部分,這樣算法將無(wú)限下去。顯然,小數(shù)的二進(jìn)制表示有時(shí)是不能精確的。道理很簡(jiǎn)單,十進(jìn)制系統(tǒng)中不能準(zhǔn)確的表示出1/3,同樣二進(jìn)制也無(wú)法準(zhǔn)確的表示1/10。這也是浮點(diǎn)型出現(xiàn)精度丟失問(wèn)題的主要原因。

 

解決方案一:

如果不介意記錄十進(jìn)制的小數(shù)點(diǎn),而且數(shù)值不大,那么可以使用long,int等基本類(lèi)型,

int resultInt = 10 -9;

double result  = (double)resultInt / 100;//自己控制小數(shù)點(diǎn)

 

解決方案二:

使用BigDecimal,而且需要在構(gòu)造參數(shù)使用String類(lèi)型.

float和double只能用來(lái)做科學(xué)計(jì)算或者工程計(jì)算,在商業(yè)計(jì)算等精確計(jì)算中,要用java.math.BigDecimal。

本文網(wǎng)址: http://gosme.cn/news/133.html
找不到任何內(nèi)容

首頁(yè)        |        產(chǎn)品中心        |        新聞資訊        |        關(guān)于我們        |        在線留言        |        聯(lián)系我們

Copyright @ 2022 青島德瑞鑫凈化工程有限公司 . All rights reserved.