[i=s] 本帖最后由 hzhh95963 于 2015-3-10 00:05 编辑
看到不少提督在计算火力和伤害等数值的时候,在无意中使用了四舍五入的取整方式。但是事实上,舰C的取整全部是向下取整(或向零取整,后面会提)这是为何呢?
那么我们来看一看计算机是如何处理取整这个操作的。常见的C语言来实现取整:
[code]// C sytle
float foo = 10.6;
int bar = (int)foo; // bar == 10[/code]或
[code]// C sytle
float foo = 10.6;
int bar = int(foo); // bar == 10[/code]
或者是在C++更加推荐的方式:
[code]// C++ sytle
float foo = 10.6;
int bar = static_cast
这里面要仔细追究也是说来话长。为什么C/C++没有采用向最接近整数取整而是向零取整?
这个问题其实很尴尬……在C99以前,C语言的标准都没有明确规定到底应该怎么取整,这个问题被留给了编译器自己来决定。编译器选择的是向Fortran靠拢。(后来在C99,向零取整就变成了语言标准)。那么Fortran为什么又要那么取整呢?具体的原因我没有调查到。这其中应该有数学上的考量,也有对当时的硬件环境的考虑。毕竟Fortran诞生的时候,就连IEEE 754这个浮点数标准都还没有出现呢。然后C++为了兼容C语言,继承了这个设计……接下来Java这个C++的精神继任者也继续采用了这个设计……
不过舰娘的后台服务端一般不会是用C/C++来写的。那些动态语言们往往有其他的实现方式。
比如,我来看看用世界上最好的编程语言PHP怎么来实现这个[s](才不是)[/s]
[code] $foo = 10.6;
$bar = floor($foo); // $bar == 10
$bar = round($foo); // $bar == 11
$bar = intval($foo) // $bar == 10
?>[/code]floor和intval有什么区别?floor返回的是一个浮点型,intval返回的是一个整型,round和ceil返回的居然也是浮点型……
[s]我个人认为PHP的类型转换简直是个死亡雷区……[/s]
那么不要管PHP了,日本人发明的Ruby是什么情况呢?
[code]# Ruby
foo = 10.6
bar = foo.floor # bar == 10
bar = foo.round # bar == 11[/code]
嗯……这两个都很正常地返回了一个整型……
说了半天,舰C是什么情况?舰C似乎并没有像前面的动态语言那样有过四舍五入?我个人认为,舰C作为一个使用HTTP连接的页游,后台非常有可能是用Java写的:
[code]// Java
foo = 10.6;
int bar = (int)foo; // bar == 10[/code](好像有点眼熟)
看,是不是都挺简单的?那么如果要使用四舍五入规则呢?事实上,一直到C99和C++11之前,C/C++都没有一个round函数。好吧,我就只写一个C++版本的吧。
[code]// C++ sytle
float foo = 10.6;
int bar;
int floor = static_cast
if ((foo – floor) < 0.5 || (foo - floor) > -0.5) {
bar = floor;
} else {
bar = floor + ((foo > 0) – (foo < 0)); // bar == 11
}[/code]感觉效率不是很高的样子……
不过Java就更加残念了……它标准库里自带的Math.round的实现是错误的……把-10.5传给这个函数返回的结果是-10而不是-11……
另外还有一些更复杂的数值修约规则,比如“奇进偶舍”……要写的代码肯定就是更长了……除非采取某些特别tricky的办法,具体不再展开了……
那么,现在假设你是程序员来实现舰娘的服务器,你会选择哪种方式呢?
一些题外话
事实上,常用的编程语言有两种取整,一种是“向零取整”,向0方向取最接近的整数。C、C++、Java采用的就是这种模式。另一种是“向下取整”,向-∞方向取最接近的整数,Python、Ruby就是采用的这种模式。两者在正数上是一致的,区别就在于对负数取整的不同行为。这里就不再展开了。编程语言具体采用哪种方式都有诸多的原因。不过无论用哪种方式,都有大坑在等着……





围观程序猿{:4_91:}
{:4_102:}{:4_103:}然而這並沒有什麼卵用,最後都是看臉暴擊的
水雲逸 发表于 2015-3-10 12:38
然而這並沒有什麼卵用,最後都是看臉暴擊的
{:4_102:}怎么没用了,看我科学灌水涨经验
楼主帖子怎么发成吐槽吹水了{:4_114:}
wakawakashine 发表于 2015-3-10 15:44
楼主帖子怎么发成吐槽吹水了
{:4_102:}本来就是来灌水的呀。这东西其实和游戏没什么太大关系
其实我就看看 觉得dalao好屌
围观大神技术帖……其实完全看不懂poi{:4_100:}