Discussion:
[請益] double轉字串!!!
(时间太久无法回复)
孤獨
2006-10-11 08:41:18 UTC
Permalink
小弟再寫作業時..由於需要~必須將Double轉為字串~
但轉出來的結果實在是很詭異~
想了想..也不知原因為何..
於是小弟做了以下實驗..
public class A
{
public static void main ( String args[] )
{
double d = 1.0;
for(int i=0; i<2; i++){
d = d*0.1;}
System.out.printf("%.2f\n",d);
String c = ""+d;
System.out.printf("%s\n",c);
double e =0.01;
String a = ""+e;
System.out.printf("%s",a);
}
}
印出來的3個數分別為
0.01
0.010000000000000002
0.01

我寫作業時轉出的結果就是第2行..
可是我不懂..d明明也是0.01阿~~
轉出來的c為什麼跟a會不一樣呢>"<~~
能否請諸位高手為小弟解惑~~為什麼經過一個for loop轉字串結果
會跟直接令double轉字串結果不同
感激不盡~

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.229.85.215
涼宮春日症候群
2006-10-11 08:53:12 UTC
Permalink
※ 引述《long0718 (孤獨)》之銘言:
: 0.01
: 0.010000000000000002
: 0.01
: 我寫作業時轉出的結果就是第2行..
: 可是我不懂..d明明也是0.01阿~~
: 轉出來的c為什麼跟a會不一樣呢>"<~~
: 能否請諸位高手為小弟解惑~~為什麼經過一個for loop轉字串結果
: 會跟直接令double轉字串結果不同
: 感激不盡~
基本上直接原因是浮點數精確度

主要是因為像十進位的0.1這種二進位的循環小數

在浮點數表示中只能近似 (電腦內部是二進位)

這些近似的數大約會有原數最高有效位數的10的負16次方倍~10的負17次方倍左右的誤差

所以乘一乘誤差就放大到看得出來了

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 192.192.197.112
孤獨
2006-10-11 09:06:23 UTC
Permalink
※ 引述《LPH66 (涼宮春日症候群)》之銘言:
: ※ 引述《long0718 (孤獨)》之銘言:
: : 0.01
: : 0.010000000000000002
: : 0.01
: : 我寫作業時轉出的結果就是第2行..
: : 可是我不懂..d明明也是0.01阿~~
: : 轉出來的c為什麼跟a會不一樣呢>"<~~
: : 能否請諸位高手為小弟解惑~~為什麼經過一個for loop轉字串結果
: : 會跟直接令double轉字串結果不同
: : 感激不盡~
: 基本上直接原因是浮點數精確度
: 主要是因為像十進位的0.1這種二進位的循環小數
: 在浮點數表示中只能近似 (電腦內部是二進位)
: 這些近似的數大約會有原數最高有效位數的10的負16次方倍~10的負17次方倍左右的誤差
: 所以乘一乘誤差就放大到看得出來了


請問一下您的意思是d是因為我用%.2f 所以顯現0.01
但是用字串時他就整個顯現出來了對嗎0.0

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.229.85.215
大學生
2006-10-11 14:24:12 UTC
Permalink
※ 引述《PsMonkey (痞子軍團團長)》之銘言:
: ==站內信件==
: ※ 引述《long0718 (孤獨)》之銘言:
: : 請問一下您的意思是d是因為我用%.2f 所以顯現0.01
: : 但是用字串時他就整個顯現出來了對嗎0.0
: 這位太太,你要不要先去查一下 %.2f 是啥意思
這不是C的語法嗎?
: 語法規格上頭會告訴你對不對

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.112.233.206
大學生
2006-10-11 14:27:56 UTC
Permalink
※ 引述《long0718 (孤獨)》之銘言:
: 小弟再寫作業時..由於需要~必須將Double轉為字串~
明明就Double.toString();
API有
可以查
: 但轉出來的結果實在是很詭異~
: 想了想..也不知原因為何..
: 於是小弟做了以下實驗..
: public class A
: {
: public static void main ( String args[] )
: {
: double d = 1.0;
: for(int i=0; i<2; i++){
: d = d*0.1;}
: System.out.printf("%.2f\n",d);
: String c = ""+d;
: System.out.printf("%s\n",c);
: double e =0.01;
: String a = ""+e;
: System.out.printf("%s",a);
: }
: }
: 印出來的3個數分別為
: 0.01
: 0.010000000000000002
: 0.01
: 我寫作業時轉出的結果就是第2行..
: 可是我不懂..d明明也是0.01阿~~
: 轉出來的c為什麼跟a會不一樣呢>"<~~
: 能否請諸位高手為小弟解惑~~為什麼經過一個for loop轉字串結果
: 會跟直接令double轉字串結果不同
: 感激不盡~
查API就好了
沒那麼複雜吧...= =

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.112.233.206
狂賀freedom被幹爆
2006-10-12 17:25:09 UTC
Permalink
Post by 孤獨
小弟再寫作業時..由於需要~必須將Double轉為字串~
好像用 sprintf 配 %f 就可以的樣子.... o_O
--
[科技]網路摩爾定律: 預沽每18個月網路小白密度增加一倍
[網論]歷年硬體連線版最有價值網友 jccjcc 獲頒.
[聯合][腦殘]因為引擎待速有 8000rpm 所以停車時請熄火
[外電]New York Times: “Taiwanese media lack ability to verify news"
[雙標]燒日製電池要低調, 爆臺製電容要大聲叫.

--
◤◥ Origin:  幽谷˙反地球聯邦組織  aeug.twbbs.org 
◣◢ Author: yokohama 從 192.168.2.2 發表
继续阅读narkive:
Loading...