2016-10-25 8 views
2

python 2.7でプログラムを書こうとしていますが、数値が他のものを均等に分割するかどうかと、分割の結果が得られるかどうかが分かります。大きな数字を分けて間違いを作っています

しかし、大きな数字を使用すると、興味深い結果が得られます。

現在、私が使用しています:私はこれを実行すると

from __future__ import division 
import math 
a=82348972389472433334783 
b=2 
if a/b==math.trunc(a/b): 
    answer=a/b 
    print 'True' #to quickly see if the if loop was invoked 

を私が取得:

True 

しかし82348972389472433334783は明らかにさえません。

ご協力いただければ幸いです。

+0

「a」の係数を2で割った値をチェックすることはありませんか?あなたの 'if 'を'%2: 'に変更することをお勧めします。 'a'が偶数の場合は' 0'、 'a'が奇数なら' 1'を返します。あなたが効果的だと思うのは、 'a/b'が' a/b'と等しいかどうかを比較することです(整数を分割するので、 'trunc'は効果がありません)。 – BorrajaX

+4

除算の結果は浮動小数点です数。あなたは単に "[浮動小数点数学は壊れていますか?](http://stackoverflow.com/questions/588004/is-floating-point-math-broken)" –

+0

@ user2357112を求めるだけです。除算の結果は* floatです。 '__future__輸入部門から '。 – jme

答えて

5

それはそれを行う狂気の方法です。余り演算子を使うだけです。

if a % b == 0: 
    # then b divides a evenly 
    quotient = a // b 
+0

それは、それが均等に分割されているかどうかを私に知らせるでしょうが、正確な結果がどのようになるかをどのように知っていますか?後で自分のコードで割り切れる場合は、正確な除算を知る必要があります。 – Dan

+3

「クレイジー」とは、「間違っている」という意味です。 –

+0

商のコードを追加しました – wim

0

数値を均等に分割できるかどうかを確認する代わりにモジュラス演算子を使用してください。

N%X == 0

1

真の分割は、暗黙的に正確aの値を格納する精度を提供しないフロートへの入力に変換します。例えば。私のマシン上で

>>> int(1E15+1) 
1000000000000001 
>>> int(1E16+1) 
10000000000000000 

あなたは精度が低いです。大きな数字でも同様のことが起こります(int(float(a))-aを比較)。
あなたの部門を確認した場合さて、あなたは結果を見るには、実際の整数再び本当に事前に予想されていない

>>> (a/b).is_integer() 
True 

であることが判明し、「さ」。

math.trunc関数は、docsから同様の処理を行います。 整数値(通常は長整数)に切り捨てられた実数値xを返します。

パイソンのダックタイピング性質は、長整数と浮動小数点の比較を可能にする、 Checking if float is equivalent to an integer value in pythonComparing a float and an int in Pythonを参照します。

関連する問題