我有一个现有的计算(在SQL中),其中包含几个涉及舍入的公式。现在我必须确保四舍五入使用一半打破平局的算法。默认情况下,SQLite的round函数使用半到偶数算法。有没有一个简单的方法来改变这一点一半了?
round
dzhpxtsq1#
内置的round函数向负无穷大舍入。在SQL中,没有简单的方法可以直接实现半偶数。你需要install your own自定义舍入函数,或者修改SQLite源代码:
if( n==0 && r>=0 && r<LARGEST_INT64-1 ){ r = (double)((sqlite_int64)(r+0.5)); }else if( n==0 && r<0 && (-r)<LARGEST_INT64-1 ){ r = -(double)((sqlite_int64)((-r)+0.5)); }else{ zBuf = sqlite3_mprintf("%.*f",n,r); sqlite3AtoF(zBuf, &r, sqlite3Strlen30(zBuf), SQLITE_UTF8); }
字符串
ygya80vv2#
我遇到了这个问题,下面的SQL似乎可以工作:从your_table中选择ceiling(1.0* your_number_column / round_to_number)* round_to_number--注:需要1.0 ,以确保它成为小数例如,如果'round_to_number'是最接近的500:从your_table中选择上限(1.0 * your_number_column / 500) 500-0保持0,1变成500,501变成1000,以此类推……
2条答案
按热度按时间dzhpxtsq1#
内置的
round
函数向负无穷大舍入。在SQL中,没有简单的方法可以直接实现半偶数。
你需要install your own自定义舍入函数,或者修改SQLite源代码:
字符串
ygya80vv2#
我遇到了这个问题,下面的SQL似乎可以工作:
从your_table中选择ceiling(1.0* your_number_column / round_to_number)* round_to_number
--注:需要1.0 ,以确保它成为小数
例如,如果'round_to_number'是最接近的500:
从your_table中选择上限(1.0 * your_number_column / 500) 500-
0保持0,1变成500,501变成1000,以此类推……