Pourquoi les Mathématiques.ronde de retour d'un long, mais les Mathématiques.plancher de retour d'un double?
Pourquoi l'incohérence?
- +1 Belle observation. Curieux veulent savoir 🙂
- Étant donné la manière dont le début des librairies de base ont été jetés ensemble, il pourrait très probablement être le hasard historique qui ne peut pas être changé en raison de l'tellement héritage dépendances. Si c'est le cas, la réponse à la question pourrait bien être perdue dans les sables du temps.
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de contradiction: les méthodes sont tout simplement conçu pour suivre les différentes spécifications.
long round(double a)
long
à l'argument.double floor(double a)
double
valeur qui est inférieure ou égale à l'argument et est égale à une mathématique entier.double ceil(double a)
double rint(double a)
double
valeur qui est la plus proche de la valeur de l'argument et est égale à une mathématique entierPar la conception
round
tours à unlong
etrint
tours à undouble
. Cela a toujours été le cas depuis le JDK 1.0.D'autres méthodes ont été ajoutées dans le JDK 1.2 (p. ex.
toRadians
,toDegrees
); d'autres ont été ajoutées dans la version 1.5 (par exemple,log10
,ulp
,signum
, etc), et encore quelques autres ont été ajoutés en 1.6 (par exemplecopySign
,getExponent
,nextUp
, etc) (voir les Depuis: métadonnées dans la documentation); maisround
etrint
ont toujours eu les uns les autres comme ils sont maintenant, depuis le début.Sans doute, peut-être, au lieu de
long round
etdouble rint
, il sera plus "cohérente" au nom de leurdouble round
etlong rlong
, mais c'est argumentatif. Cela dit, si vous insistez sur catégoriquement d'appeler cela une "incohérence", la raison peut être que non satisfaisante que "parce que c'est inévitable".Voici une citation de Efficace Java 2nd Edition, Point 40: méthode de Conception de signatures soigneusement:
Lointainement liée à des questions
int num = Integer.getInteger("123")
lancerNullPointerException
?floor()
doit retourner un double tandis queceil()
doit retourner un int, ce serait "cohérent"?ceil
sont étroitement liés. Il y around
et il n'y arint
. Je ne sais pas quoi d'autre voulez-vous. Je vais essayer de répondre à cette objectivement, la poursuite de la spéculation semble hypothétique et/ou subjective..rint()
méthode a été ajouté plus tard à l'adresse de l'incohérence.@since
métadonnées, à la foisrint
etround
ont toujours été là depuis le début. Certaines méthodes ont été ajoutées dans la version 1.2, 1.5 et 1.6, et ils sont clairement identifiés comme tels.Math.rint()
etMath.rlong
retourint
etlong
respectivement aurait fait beaucoup plus de sens que d'avoirMath.round()
retourlong
lors d'unedouble
, etint
lors de donnée tout autre type primitif.floor
aurait été choisie pour correspondre à la norme c la routine dans les mathématiques.h (rint
, mentionné dans une autre réponse, est également présent dans la bibliothèque, et renvoie undouble
, comme en java).mais
round
n'était pas une fonction standard dans c à ce moment (ce n'est pas mentionné dans C89 - c identificateurs et des normes; c99 n'définirround
et il renvoie undouble
, comme vous vous en doutiez). il est normal que la langue concepteurs à "emprunter" des idées, donc peut-être que ça vient d'une autre langue? fortran 77 n'a pas une fonction de nom et je ne suis pas sûr de ce que le reste aurait été utilisé à l'époque comme une référence. peut-être vb - qui n'ontRound
mais, malheureusement pour cette théorie, il renvoie unedouble
(php aussi). il est intéressant de noter, perl évite délibérément la définition de ronde.[mise à jour: hmmm. ressemble smalltalk retourne entiers. je ne sais pas assez sur smalltalk savoir si c'est correct et/ou général, et la méthode est appelée
rounded
, mais il pourrait être la source. smalltalk n'influence java, à certains égards, (bien que sur le plan conceptuel que dans les détails).]si ce n'est pas smalltalk, alors que nous sommes à gauche, avec l'hypothèse que quelqu'un simplement choisi mal (étant donné les conversions implicites possible en java il me semble que le retour d'un
double
aurait été plus utile, car il peut être utilisé à la fois lors de la conversion de types et quand on fait les calculs en virgule flottante).en d'autres termes: fonctions communes à java et c ont tendance à être compatible avec la bibliothèque c standard à l'époque, le reste semble être arbitraire, mais cette ride peut viens de smalltalk.
Je suis d'accord, qu'il est étrange que
Math.round(double)
retournelong
. Si de grandesdouble
les valeurs sont exprimées àlong
(qui est ce queMath.round
implicitement le fait),Long.MAX_VALUE
est retourné. Une alternative est d'utiliserMath.rint()
afin d'éviter que. Cependant,Math.rint()
a un peu étrange comportement d'arrondissage: les liens sont réglées par arrondi à l'entier pair, c'est à dire 4.5 est arrondi à 4.0 5.5 mais est arrondi à 6.0). Une autre alternative est d'utiliserMath.floor(x+0.5)
. Mais sachez que de 1,5 est arrondi à 2 alors que -1.5 est arrondie à -1, pas de -2. Encore une autre alternative est d'utiliserMath.round
, mais seulement si le nombre est dans la gamme entre la Longue.MIN_VALUE et Long.MAX_VALUE. En virgule flottante Double précision les valeurs en dehors de cette gamme sont des nombres entiers de toute façon.Malheureusement, pourquoi
Math.round()
retournelong
est inconnue. Quelqu'un a pris cette décision, et il est probable qu'il n'a jamais donné une interview pour nous expliquer pourquoi. Ma conjecture est que les Mathématiques.ronde a été conçu pour fournir une meilleure façon (c'est à dire, avec les arrondis) pour la conversion de la double à la nostalgie.