Mysql - 下半轮或半上半轮

时间:2015-11-19 13:01:36

标签: mysql rounding

有没有办法指定我们是否要在使用MySql的SQL查询中将字段值4.485转换为4.48(一半向下)或4.49(一半向上)?

由于

6 个答案:

答案 0 :(得分:1)

您可以使用CEIL(或CEILING)和FLOOR功能向上/向下舍入。

例如:

 <RelativeLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

        **<!-- Edit text with drawable at top left -->**
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:background="@drawable/image">

            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/edit"
                android:hint="Enter text"
                android:maxLines="10"
                android:inputType="textMultiLine" />
        </FrameLayout>
 </RelativeLayout>

答案 1 :(得分:0)

使用mysql ROUND()

Select Round(4.485,2)

答案 2 :(得分:0)

这篇文章的接受答案提供了一个很好的解决方案: MySQL - How can I always round up decimals?

即乘以10 ^ n,其中n是您要舍入的小数位,然后调用ceil向上舍入或floor向下舍入并除以10 ^ n。

答案 3 :(得分:0)

即使这个问题已经存在多年,我也遇到了同样的问题,并找到了一个我想分享的不同解决方案。

这是:使用条件函数,您明确决定在最后一个小数为5时要舍入的方式。 例如,如果你想用2位小数向上舍入一半:

SELECT IF ((TRUNCATE(mynumber*1000,0) mod 5) = 0,CEIL(mynumber*100)/100,ROUND(mynumber,2)) as value FROM mytable

如果要向下舍入一半,可以使用FLOOR函数代替CEIL;如果你想要不同的小数位数,比如 n ,你可以改变TRUNCATE调用中的乘数(10 ^ n + 1 )并将它传递给ROUND函数。

SELECT IF ((TRUNCATE(mynumber*([10^*n+1*]),0) mod 5) = 0,[CEIL|FLOOR](mynumber*100)/100,ROUND(mynumber,[*n*])) as value FROM mytable

答案 4 :(得分:0)

根据Mysql docs

  • 对于精确值数字,ROUND()使用“四舍五入”规则

我也遇到一种情况,我想知道为什么将Mysql四舍五入(1)74,447到74,4。这是因为它实际上是一个无穷长的小数,是一个近似值数字,而不是一个精确值数字。对我来说,解决方案是必须像这样使用ROUND() 3x:ROUND(ROUND(ROUND(value, 3), 2), 1)。第一个舍入确保不再是近似值数字(Mysql使用“四舍五入到最接近的偶数”规则),而不是精确值数字,十进制的三个数字。

答案 5 :(得分:0)

我也有同样的疑问,我尝试了各种自定义函数来模拟 PHP 的功能,但过了一会儿,我发现 MySQL 使用 float 和 doubles 字段产生不同的结果。

>

这是我的测试。

mysql> select columna_double, columna_float, round ( columna_double, 2) as round_double, round ( columna_float, 2) as round_float from test_redondeo;
+----------------+---------------+--------------+-------------+
| columna_double | columna_float | round_double | round_float |
+----------------+---------------+--------------+-------------+
|        902.025 |       902.025 |       902.02 |      902.03 |
+----------------+---------------+--------------+-------------+
1 row in set (0.00 sec)

在字段中输入 double,舍入函数截断,但在 float 中向上舍入。

org.elasticsearch.action.ActionRequestValidationException: Validation Failed: 1: id is missing;
    at org.elasticsearch.action.bulk.BulkRequest.validate(BulkRequest.java:614)
    at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1731)
    at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:1697)
    at org.elasticsearch.client.RestHighLevelClient.bulk(RestHighLevelClient.java:473)
    at com.clougence.cloudcanal.es6.task.write.full.Es6FullInsertExecutorImpl.insert(Es6FullInsertExecutorImpl.java:70)
    at com.clougence.cloudcanal.es6.task.write.full.Es6FullApplyHandler.handle(Es6FullApplyHandler.java:35)
    at com.clougence.cloudcanal.es6.task.write.full.Es6FullApplyHandler.handle(Es6FullApplyHandler.java:16)
    at com.clougence.cloudcanal.task.applier.full.FullApplyWorkHandler.onEvent(FullApplyWorkHandler.java:61)
    at com.clougence.cloudcanal.task.applier.full.FullApplyWorkHandler.onEvent(FullApplyWorkHandler.java:20)
    at com.lmax.disruptor.WorkProcessor.run(WorkProcessor.java:143)
    at java.lang.Thread.run(Thread.java:748)

如果您以任何方式使用 round() 制作了用于舍入数字的自定义函数,请注意字段类型。

希望这个测试对你有帮助。