回答編集履歴

1

修正

2023/03/08 04:51

投稿

can110
can110

スコア38266

test CHANGED
@@ -1,7 +1,12 @@
1
1
  > 入力した数字がこのまま保存されるか、変わってしまうかをPythonで判別することは可能でしょうか。
2
2
 
3
- PostgreSQLでのreal型は(通常は)単精度の浮動小数点値のようですが、python自体には単精度の型は存在しません。
3
+ まず、PostgreSQLでのreal型は(通常は)単精度の浮動小数点値のようですが、python自体には単精度の型は存在しません。
4
+ つまり、いったんPythonのtkinter上に表示~なんらか入力された値は倍精度であるため、原理的に**このまま保存**することはできません。
5
+ また見た目上同じな「0.999999」であっても、単精度と倍精度では異なる値となります。
6
+
7
+ どのようなルールで判別したいのか分かりませんが
4
- そのかわりに`numpy.float32`が使えるので、numpyの数値に変換して元の値と`==`で、あるいは`math.isclose`判定できると思います。
8
+ numpy.float32が使えるので、numpyの数値に変換して元の値と==で、あるいはmath.iscloseで
9
+ あるいは文字列化した結果が同じか?なりで判定すればよいかと思います。
5
10
  ```Python
6
11
  import numpy as np
7
12
  import math
@@ -10,14 +15,12 @@
10
15
  a2 = a1.astype(np.float32)
11
16
 
12
17
  for x, y in zip(a1, a2):
13
- print(x, y, x==y, math.isclose(x,y), x-y)
18
+ print(x, y, x==y, math.isclose(x,y), str(x)==str(y), x-y)
14
19
  """
15
- 999999.0 999999.0 True True 0.0
20
+ 999999.0 999999.0 True True True 0.0
16
- 0.999999 0.999999 False False 1.327896115288496e-08
21
+ 0.999999 0.999999 False False True 1.327896115288496e-08
17
- 9999.9999 10000.0 False False -9.999999929277692e-05
22
+ 9999.9999 10000.0 False False False -9.999999929277692e-05
18
- 1000000.0 1000000.0 True True 0.0
23
+ 1000000.0 1000000.0 True True True 0.0
19
24
  """
20
25
  ```
21
26
 
22
-
23
-