Pourquoi ne puis-je passer une grande valeur en tant que Int32?
-
28-10-2019 - |
Question
J'ai un numéro: 94800620800
flotteur est de 4 octets de type de données. Int32 est de 4 octets de type de données.
float f = 94800620800; // ok
Int32 t = 94800620800; // error
S'il vous plaît expliquer ce problème. Pourquoi je reçois une erreur lors de l'utilisation Int32. Pourquoi je peux utiliser ce numéro pour le type de données float, car les deux sont de type de données de 4 octets. Merci.
La solution
Parce que le numéro que vous essayez de assign est plus grand que le valeur la plus élevée possible pour un certain nombre de type Int32
, qui se trouve être 2147483647. A noter, la valeur maximale pour un Single
est 3,402823 × 10 38 .
Autres conseils
La valeur maximale pour Int32 est 2147483647 -. Qui est inférieure à 94800620800
Un flotteur peut prendre une valeur dans la plage suivante: ± 1,5 × 10-45 à ± 3,4 × 1038
En outre, consultez cette question SO - quelle est la différence entre le type de données float et entier lorsque la taille est même en java? . Il est une question Java, mais le concept est le même et il y a une explication détaillée de la différence, même si elles sont de la même taille.
Parce que ce nombre est trop grand pour un 4 octets int. Les valeurs scalaires comme Int32
ont un minimum et limite maximale (qui sont -2 31 et 2 31 - 1 dans ce cas, respectivement), et vous ne pouvez pas stocker une La valeur en dehors de cette plage.
nombres à virgule flottante sont stockés de façon totalement différente, de sorte que vous ne serez pas les erreurs du compilateur avec des valeurs énormes, que possible des problèmes de précision plus tard, lors de l'exécution.
En raison de ces types de représentation interne.
float
utilise quelque chose comme i, d ^ n où i est la partie entière, d est la partie décimale et n est l'exposant (bien sûr, cela se produit en base 2).
De cette façon, vous pouvez stocker plus grand nombre dans un float
, mais il ne sera pas précis comme, par exemple, Int32
à stocker des nombres entiers. Si vous tentez de convertir
float f = 94800620800;
à un assez grand type intégral pour stocker sa valeur, il ne peut pas être le même que le 94800620800 initial.
types de représentations sont exactes Entiers, tandis que les nombres à virgule flottante sont une combinaison de chiffres significatifs et exposant.
Le virgule flottante page wiki est d'expliquer comment cela fonctionne.
Peut-être que vous devriez lire le message d'erreur? ;)
Error Integral constant is too large
valiue le maximum d'un 32 bit est int 2147483647
le flotteur d'autre part fonctionne parce qu'il stocke une mantisse et exposant, plutôt qu'un seul numéro, il peut donc faire face à une gamme beaucoup plus au détriment de la possibilité de perdre la précision
essayez d'imprimer votre flotteur et vous obtiendrez 94800620000
au lieu de 94800620800
que les bits inférieurs sont perdus
Int32 a une valeur maximale de 2147483647. Votre valeur est beaucoup plus élevé.
Jetez un oeil à system.int32.maxvalue
valeur fournie de l'expression constante est pas dans la plage de type de données int.
La gamme de Int32 va de - 2.147.483.648 à 2.147.483.647. Votre variable est ainsi hors de portée.