JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 新手區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 取整數問題[會自動進位.想無條件捨去]
hahakyo





發文: 4
積分: 0
於 2008-10-23 16:31 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
如題
舉例而言
double d1 = 4.9999; //想要抓出整數位4 可利用
int c1 = (int)d1; //如此c1可得我想要的值4
但是. 當小數點位數太多時 例如 d1=4.99999999999999999999;
那麼以我上面的寫法 得到的數值會變5 也就是自動進位了

實際上 我要處理的數據大概是這樣的形式: d2=0.1234567899999999999999999
我要抓出第8位數.也就是8這個數[前幾位抓到也沒關係]
我先把d2乘以10的8次方 變成12345678.99999999999999999
想抓出整數12345678
但至今試過許多方法.仍然會取成12345679

想請教一下 該如何處理這樣的問題呢?
感謝

PS.有試著用用BigDecimal運算
雖然BigDecimal可以在取比較精準的位數下進行加 減 乘 除的運算
但似乎也無法使用什麼方法將我要的整數位取出來
甚至最後輸出前,轉成DOUBLE.還是一樣9會自動進位

其他像轉string的方法等.也都試過.但是結果仍一樣


reply to postreply to post
作者 Re:取整數問題[會自動進位.想無條件捨去] [Re:hahakyo]
SamWang0723

buz head



發文: 143
積分: 0
於 2008-10-23 16:56 user profilesend a private message to usersend email to SamWang0723reply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
轉string怎麼會不行??

String txt = String.valueOf(d1);
int c1 = Integer.parseInt(txt.split("\\.")[0]);

不過這種方法不好....


reply to postreply to post
Java 的能量在我身體裡不停鑽動著...May java force be with u
http://www.samsharehome.blogspot.com/
作者 Re:取整數問題[會自動進位.想無條件捨去] [Re:hahakyo]
cjack





發文: 312
積分: 1
於 2008-10-23 17:05 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
簡單的方法:
Math.floor(4.5555d)

就算手動去做,也可以:
a = 4.5555d
b = (int) a

if b> a then b--


reply to postreply to post
En Taro Adun!
作者 Re:取整數問題[會自動進位.想無條件捨去] [Re:hahakyo]
hahakyo





發文: 4
積分: 0
於 2008-10-23 18:02 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
不好意思
以上兩位的方法我之前都試過
小數點下很少位的情況下是行的通的

但如同我發文所言
我的小數點下有很多9
用上面兩位提到的方法.它還是會自動進位
@@"


reply to postreply to post
作者 Re:取整數問題[會自動進位.想無條件捨去] [Re:hahakyo]
cjack





發文: 312
積分: 1
於 2008-10-23 18:33 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
看來,您不將程式post上來,是難以解決了

reply to postreply to post
En Taro Adun!
作者 Re:取整數問題[會自動進位.想無條件捨去] [Re:hahakyo]
UndeadJ

UX & UI Design



發文: 384
積分: 3
於 2008-10-23 20:02 user profilesend a private message to usersend email to UndeadJreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我要抓出第8位數.也就是8這個數[前幾位抓到也沒關係]

----
得到之後有要做什麼運算之類的嗎?
還是只要得到就好 (也就是最後的結果)


reply to postreply to post
我們是懷抱各自的夢想,買了車票的乘客,不過就像列車一定會有終點,人生有時會碰到必須換車的時候...

我們站在名為「今天」的車站,在名為「昨天」的列車下車,轉搭為「明天」的列車

不過,若沒及時搭上的話....
作者 Re:取整數問題[會自動進位.想無條件捨去] [Re:hahakyo]
dreamltf

wicket



發文: 649
積分: 5
於 2008-10-23 20:19 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
hahakyo wrote:
雖然BigDecimal可以在取比較精準的位數下進行加 減 乘 除的運算
但似乎也無法使用什麼方法將我要的整數位取出來

1
2
3
4
BigDecimal b1 = new BigDecimal("100000000");
BigDecimal b2 = new BigDecimal("0.1234567899999999999999999");
 
System.out.println(b1.multiply(b2).intValue());


dreamltf edited on 2008-10-23 20:23
reply to postreply to post
作者 Re:取整數問題[會自動進位.想無條件捨去] [Re:hahakyo]
girl0167f





發文: 4
積分: 0
於 2008-10-23 21:04 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
public class eightnum{
public static void main(String[] args){
double d2=0.1234567899999;
int a=(int)(d2*(100000000));
System.out.print("前8位數字是:"+a);
}
}

我用這個程式可以RUN的出來...
你試試看~~


reply to postreply to post
作者 Re:取整數問題[會自動進位.想無條件捨去] [Re:hahakyo]
SamWang0723

buz head



發文: 143
積分: 0
於 2008-10-23 21:27 user profilesend a private message to usersend email to SamWang0723reply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
每一種程式語言在數字運算都有極限, Java在你說的這種小數點非常多數字處理本來就沒有很高的精度, 或許你該想一想為什麼會產生出這些數字...

reply to postreply to post
Java 的能量在我身體裡不停鑽動著...May java force be with u
http://www.samsharehome.blogspot.com/
作者 Re:取整數問題[會自動進位.想無條件捨去] [Re:dreamltf]
hahakyo





發文: 4
積分: 0
於 2008-10-23 22:30 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
dreamltf wrote:
1
2
3
4
BigDecimal b1 = new BigDecimal("100000000");
BigDecimal b2 = new BigDecimal("0.1234567899999999999999999");
 
System.out.println(b1.multiply(b2).intValue());



感謝 此方法可以解決我的問題
雖然說我是在跑一個迴圈.轉成BigDecimal運算上似乎要花點時間
不過能夠抓出已經很棒了!感謝


reply to postreply to post
作者 Re:取整數問題[會自動進位.想無條件捨去] [Re:hahakyo]
hahakyo





發文: 4
積分: 0
於 2008-10-23 22:37 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
To cjack:
若您要我完整的問題.內容有點複雜@@"
但我卡住的地方就如同我說的.當小數點下很多9時會自動進位的問題^^"

To UndeadJ:
恩.我得到後會再拿來運算

To girl0167f:
這方法也是我一開始用的方法
原本也以為可行
但如同我原文所述.當小數點下很多9時就會自動進位
所以說您的方法還是會進位^^"

To SamWang0723:
恩.關於您說的我也知道
但好巧不巧的遇到這個問題~_~"也只能試著去解

感謝以上各位


reply to postreply to post
作者 Re:取整數問題[會自動進位.想無條件捨去] [Re:hahakyo]
girl0167f





發文: 4
積分: 0
於 2008-10-23 23:46 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
如果 int a=(int)(d2*(100000000)); 這行不寫....

加上 : int b=100000000;
double c=d2*b;
int a=(int)(c-0.5);

if (a<c){
System.out.print("前8位數字是:"+a);
}

這樣應該就可以了~


reply to postreply to post
作者 Re:Applet和HTML網頁要如何寫主程式? [Re:hahakyo]
girl0167f





發文: 4
積分: 0
於 2008-10-24 10:13 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
這兩個檔要怎麼結合呢~?
請各位幫我解答,好嗎~?
謝謝!~

檔名:Sample3.htm
<HTML>
<HEAD>
<BODY>
<APPLET CODE="Sample3.class" WIDTH=200 HEIGHT=100>
</APPLET>
</HEAD>
</BODY>
</HTML>

檔名:Sample3.java
/**
*這段在瀏覽器上使用
*/
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;

public class Sample3 extends Applet
{
Image img;

public void init()
{
img = getImage(getDocumentBase(),"Image.gif");
}
public void paint(Graphics g)
{
g.drawImage(img, 10, 10, this);
}
}


reply to postreply to post
作者 Re:取整數問題[會自動進位.想無條件捨去] [Re:hahakyo]
cjack





發文: 312
積分: 1
於 2008-10-24 16:17 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
hahakyo wrote:
To cjack:
若您要我完整的問題.內容有點複雜@@"
但我卡住的地方就如同我說的.當小數點下很多9時會自動進位的問題^^"

在下想看一下程式,是因為在下感覺不到你的問題,總覺得無論是作成字串、或是比大小的邏輯應該都能輕易又快速的做完。所以我想見識一下該問題如何存在。


cjack edited on 2008-10-24 16:32
reply to postreply to post
En Taro Adun!
作者 Re:取整數問題[會自動進位.想無條件捨去] [Re:cjack]
kebin_liu

雲端決策系統

版主

發文: 1861
積分: 11
於 2008-10-24 17:37 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
如果一開始的資料來源是字串,那必須一開始就轉成 BigDecimal,
或是程式從頭到尾都用 BigDecimal來處理,這樣就不會有問題。

但如果資料一開始就是 double等運算的結果,那麼 多想想 SamWang0723 前面說的
SamWang0723 wrote:
每一種程式語言在數字運算都有極限, Java在你說的這種小數點非常多數字處理本來就沒有很高的精度, 或許你該想一想為什麼會產生出這些數字...


看這兩段程式
1
2
3
4
5
double d = 0.1234567899999999999999999;
BigDecimal b1 = new BigDecimal("100000000");
BigDecimal b2 = new BigDecimal(d);
System.out.println(b1.multiply(b2).intValue());
//結果 12345678

把0.12 改成0.14,結果就進位了。
1
2
3
4
5
double d = 0.1434567899999999999999999;
BigDecimal b1 = new BigDecimal("100000000");
BigDecimal b2 = new BigDecimal(d);
System.out.println(b1.multiply(b2).intValue());
//結果 14345679 <-- 真糟糕還是進位了

也就是說,你還是得考慮精度的問題。


reply to postreply to post
用網路當作交際工具是一種病態,但當大家都病態之後,他就是一種常態。
作者 Re:取整數問題[會自動進位.想無條件捨去] [Re:kebin_liu]
cjack





發文: 312
積分: 1
於 2008-10-29 14:30 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
kebin_liu wrote:
刪恕


喔喔!果然如此,大大的例子真棒!我就想,如果問題是在精度上,那麼轉string、或是數字的邏輯都中招了,那multiply(something).intValue()也應該要中招才對呀XD

看來,以後碰到小數點,真的要從頭到尾考慮。


reply to postreply to post
En Taro Adun!
作者 Re:取整數問題[會自動進位.想無條件捨去] [Re:hahakyo]
yjy198410





發文: 27
積分: 0
於 2018-06-15 07:50 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
double d = 0.1434567899999999999999999;
BigDecimal b1 = new BigDecimal("100000000");
BigDecimal b2 = new BigDecimal(d);
BigDecimal b3 = new BigDecimal("0.1434567899999999999999999");
 
logger_class.info("d(0.1434567899999999999999999)={}",d);
logger_class.info("b1/b2={}",b1.multiply(b2).intValue());
//結果 14345679 <-- 真糟糕還是進位了,原因是 0.1434567899999999999999999超過double可以存放的範圍,也就是溢位了
logger_class.info("b1/b3={}",b1.multiply(b3).intValue());
//結果 14345678 <-- 正確,將 0.1434567899999999999999999以文字方式存放輸入
 
//#####################混合運算(1/3)+2#######################
logger_class.info("1/3={}",1/3);
//不是想要的結果。結果0,期待0.333333333無限循環。因為1是整數
 
logger_class.info("1d/3={}",1d/3);
//結果0.3333333333333333
 
logger_class.info("1.0/3={}",(1.0/3));
//結果0.3333333333333333
 
logger_class.info("1.0/3*2={}",(1.0/3)+2);
//不是想要的結果。結果2.3333333333333335,期待2.33333333333333333無限循環。
 
logger_class.info("1.0/3*2={}",((double)Math.round(1.0*1000/3))/1000+2);
//結果2.333,利用*1000後運算,再/1000達到進位小數第3位。最後再+2
 
BigDecimal val1 = new BigDecimal(1);
BigDecimal val3 = new BigDecimal(3);
BigDecimal val2 = new BigDecimal(2);
logger_class.info("1/3*2={}",val1.divide(val3,3,RoundingMode.HALF_UP).add(val2));
//利用BigDecimal先除法,四捨誤入到小數第3位,再加2


在每個語言都會有數值溢位的問題,採取方案如下:
1.若輸入的數值真的大於數值型態存放大小,必須以文字10進位方式運算,Java中採用BigDecimal。
2.適當限制數值輸入大小、運算結果限制小數點位數(如四捨五入、無條件進位、無條件捨去)。


yjy198410 edited on 2018-06-15 08:32
reply to postreply to post
十年磨一劍,我老是在磨劍。那怕磨劍不成,鐵杵磨成繡花針。
琢磨JSF, JavaFX, Design Pattern
» JWorld@TW »  Java 新手區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8