pol*_*nts 17

没有不一致之处:这些方法的设计遵循不同的规范.

所以通过设计round轮到a longrint轮到a double.自JDK 1.0以来一直如此.

在JDK 1.2加入其它的方法(例如toRadians,toDegrees); 在1.5中加入其他人(例如log10,ulp,signum等),并且还更一些是在1.6中加入(例如copySign,getExponent,nextUp等)(查找时间:在文档中的元数据); 但roundrint一直相依为命,他们现在是从一开始的方式.

可以说,也许是代替long rounddouble rint,它会是更多的"一致"他们的名字double roundlong rlong,但这是议论文.也就是说,如果你坚持断然称这是"不一致",那么原因可能就像"因为它是不可避免的"一样令人不满意.

以下是Effective Java 2nd Edition,第40项:设计方法签名的引用:

如有疑问,请查看Java库API以获取指导.虽然存在许多不一致 - 考虑到这些图书馆的规模和范围,这是不可避免的 - 但也有相当多的共识.

遥远的相关问题

  • -1此参数无效.如果他们指定`floor()`应该返回一个double而ceil()`应该返回一个int,那会是"一致"吗? (10认同)
  • @NullUserException:`floor`和`ceil`密切相关.有'圆形',有'rint`.我不知道你还想要什么.我试图客观地回答这个问题,进一步的推测似乎是假设的和/或主观的. (5认同)
  • 我从未听说过Math.rint().谢谢你的解释.我认为rint是一个愚蠢的方法名称. (4认同)
  • 很公平......看起来这个“.rint()”方法仍然是后来添加的,以解决不一致的问题。 (2认同)

and*_*oke 6

floor将被选择匹配math.h中的标准c例程(rint在另一个答案中提到,也存在于该库中,并返回a double,如在java中).

round当时不是c中的标准函数(在C89中没有提到 - c标识符和标准 ; c99确实定义round并且它返回一个double,如你所料).语言设计师"借用"想法是正常的,所以也许它来自其他语言?fortran 77没有该名称的功能,我不确定当时还有什么用作参考.也许vb - 确实有,Round但不幸的是,这个理论,它返回一个double(PHP也).有趣的是,perl 故意避免定义回合.

[更新:嗯.看起来像smalltalk返回整数.我不太了解smalltalk知道这是否正确和/或一般,并且该方法被调用rounded,但它可能是源. smalltalk确实在某些方面影响了java(虽然在概念上比在细节上更多).]

如果它不是smalltalk,那么我们留下的假设是某人只是选择不好(鉴于在Java中可能存在隐式转换,在我看来返回a double会更有用,因为它可以在转换类型时使用在进行浮点计算时).

换句话说:java和c共有的函数往往与当时的c库标准一致; 其余的似乎是任意的,但这种特殊的皱纹可能来自smalltalk.