2016-09-27 111 views
1

我需要編寫一個Python腳本,它將基數10中的x轉換爲二進制數,並在小數點後最多包含n個值。我不能只使用bin(x)!下面是我有:將十進制轉換爲二進制的Python代碼

def decimal_to_binary(x, n): 
    x = float(x) 
    test_str = str(x) 
    dec_at = test_str.find('.') 

    #This section will work with numbers in front of the decimal 
    p=0 
    binary_equivalent = [0] 
    c=0 
    for m in range(0,100): 
     if 2**m <= int(test_str[0:dec_at]): 
      c += 1 
     else: 
      break 

    for i in range(c, -1, -1): 
     if 2**i + p <= (int(test_str[0:dec_at])): 
      binary_equivalent.append(1) 
      p = p + 2**i 
     else: 
      binary_equivalent.append(0) 
    binary_equivalent.append('.') 

    #This section will work with numbers after the decimal 
    q=0 
    for j in range(-1, -n-1, -1): 
     if 2**j + q <= (int(test_str[dec_at+1:])): 
      binary_equivalent.append(1) 
      q = q + 2**j 
     else: 
      binary_equivalent.append(0) 

    print float((''.join(map(str, binary_equivalent)))) 

所以說,你叫由decimal_to_binary功能(123.456,4)應該轉換123.456與小數點後4位,產生1111011.0111爲二進制。

第一部分是細 - 將採取的數字在小數點的前面,在這種情況下123,並且將其轉換爲二進制,輸出1111011

然而,第二部分,其之後的與值涉及十進制,不是在做我認爲應該做的事。它給出的輸出不是.0111,而是.1111

我用筆和紙運行代碼,記下每個變量的值,它應該可以工作。但事實並非如此。誰能幫我解決這個問題嗎?

我所說的功能decimal_to_binary(123.456,4),並打印出1111011.1111

回答

0

你靠近,但是當你超越小數有一個問題,你的比較:

if 2**j + q <= (int(test_str[dec_at+1:])): 

你在這裏做的是將一個小數值(因爲j總是負值)與一個整數值的值進行比較。出於所有實際目的,這種比較將始終如此。

基於周圍的邏輯,我的猜測是你試圖在這裏將它與實際的十進制值進行比較。使用你的數據,這將是0.4在第一次循環,所以你希望進行評估的聲明爲:

0.5 <= 0.4 

在你的代碼中實際的比較是:

0.5 <= 4 

有兩個單獨的問題這裏:

  1. 您正在採取小數點後的所有數字,但實際上並沒有在提取中包含小數點本身。這主要是你錯誤地在你的測試中得到整數的原因。這只是簡單地通過參考test_str[dec_at:]而不是test_str[dec_at+1:]
  2. 您正在鑄造爲int。即使您在第一個點應用了更改,您的代碼仍然無法正常運行。但是,在這種情況下,這將是因爲在每次迭代中,演員陣列都會將值截斷爲0。轉換爲浮動改爲:float(test_str[dec_at:])

你比較行因此成爲if 2**j + q <= (float(test_str[dec_at:])):,它提供了我的機器上正確的輸出。

請注意,浮點比較在某些情況下可能會「挑剔」,具體取決於四捨五入等。如果需要,有ways to mitigate this

+0

哦,好痛心。這是一個很簡單的錯誤......非常感謝你! – dvanny

相關問題