salesforce 零基础学习(四十三)运算取余

工作中遇到一个简单的小问题,判断两个数是否整除,如果不整除,获取相关的余数。

习惯java的我毫不犹豫的写下了代码

public Boolean isDivisibility(Integer dividend,Integer divider) {
    return dividend % divider == 0;    
}

提交代码发现竟然提交不上??

后来查看API发现apex中没有直接的%取余运算,所以如果想要取余以及判断是否整除需要其他方式,代码如下:

public without sharing class MathHelper {
    
    /*
        是否整除
        @param dividend 被除数
        @param divider  除数
        @return 整除返回true,不整除返回false
    */
    public static Boolean isDivisibility(Integer dividend,Integer divider) {
        //先将被除数转换成Decimal,否则先计算整数除法结果为Integer类型,然后将整数转换成Decimal
        Decimal resultDecimal = Decimal.valueOf(dividend) / divider;
        //获取结果上线
        Integer resultSeiling = Integer.valueOf(resultDecimal.round(System.RoundingMode.CEILING));
        Integer resultDown = Integer.valueOf(resultDecimal.round(System.RoundingMode.DOWN));
        
        return resultSeiling == resultDown;
    }
    
    /*
        获取余数
        @param dividend 被除数
        @param divider  除数
        @return 返回余数
    */
    public static Integer getRemainder(Integer dividend,Integer divider) {
        Decimal resultDecimal = Decimal.valueOf(dividend) / divider;
        Integer resultDown = Integer.valueOf(resultDecimal.round(System.RoundingMode.DOWN));
        return dividend - resultDown * divider;
    } 
}

调用结果显示:

通过上述代码可以看出,我们运算的主要方式为将被除数转换成Decimal类型,除以除数得到Decimal类型的余数,通过取舍规则获取他的上限值和下限值,如果上限和下限相等,则整除,否则不整除。

这里我们主要用到的是取舍模式。System.RoundingMode包含以下常用的取值:

UP:简单的说,UP是对decimal值进行绝对值向上取,符号不变化。

    1.    5.5通过RoundingMode.UP操作以后变成了6;

    2.    -1.5通过RoundingMode.UP操作以后变成了-2;

DOWN:简单的说,DOWN是对decimal值进行绝对值向下取,符号不变化。

    1.    5.5通过RoundingMode.DOWN操作以后变成了5;

    2.    -1.5通过RoundingMode.DOWN操作以后变成了-1;

CELLING:对于正数,CELLING操作和UP操作相同,对于负数,操作和DOWN操作相同。

    1.    5.5通过RoundingMode.CELLING操作以后变成了6;

    2.    -1.5通过RoundingMode.CELLING操作以后变成了-1;

FLOOR:对于正数,FLOOR操作和DOWN操作相同,对于负数,操作和UP操作相同。

    1.    5.5通过RoundingMode.FLOOR操作以后变成了5;

    2.    -1.5通过RoundingMode.FLOOR操作以后变成了-2;

HALF_UP:小数点部分大于等于0.5,绝对值向上取,符号跟随。

1.    5.5通过RoundingMode.FLOOR操作以后变成了6;

    2.    5.1通过RoundingMode.FLOOR操作以后变成了5,因为0.1<0.5;

    3.    -1.5通过RoundingMode.FLOOR操作以后变成了-2;

    4.    -1.1通过RoundingMode.FLOOR操作以后变成了-1;

HALF_DOWN:小数点部分大于0.5,绝对值向上取,符号跟随。

    1.    5.5通过RoundingMode.FLOOR操作以后变成了5;

    2.    5.7通过RoundingMode.FLOOR操作以后变成了6,因为0.7>0.5;

    3.    -1.5通过RoundingMode.FLOOR操作以后变成了-1;

    4.    -1.7通过RoundingMode.FLOOR操作以后变成了-2;

总结:本篇主要描述两个整数是否整除并且获取余数的方法以及取舍模式的几个值得概念以及定义,详情了解请自行查看官方API文档,有错误的地方欢迎指正,有问题欢迎留言。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏芋道源码1024

熔断器 Hystrix 源码解析 —— 断路器 HystrixCircuitBreaker

本文主要基于 Hystrix 1.5.X 版本 1. 概述 2. HystrixCircuitBreaker 3. HystrixCircuitBreaker....

5747
来自专栏我和未来有约会

Kit 3D 更新

Kit3D is a 3D graphics engine written for Microsoft Silverlight. Kit3D was inita...

2926
来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

3005
来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

5228
来自专栏码匠的流水账

聊聊NettyConnector的start及shutdown

reactor-netty-0.7.6.RELEASE-sources.jar!/reactor/ipc/netty/NettyConnector.java

1031
来自专栏落花落雨不落叶

canvas画简单电路图

84011
来自专栏hbbliyong

WPF Trigger for IsSelected in a DataTemplate for ListBox items

<DataTemplate DataType="{x:Type vm:HeaderSlugViewModel}"> <vw:HeaderSlug...

4214
来自专栏Ceph对象存储方案

Luminous版本PG 分布调优

Luminous版本开始新增的balancer模块在PG分布优化方面效果非常明显,操作也非常简便,强烈推荐各位在集群上线之前进行这一操作,能够极大的提升整个集群...

3665
来自专栏飞扬的花生

jsencrypt参数前端加密c#解密

      写程序时一般是通过form表单或者ajax方式将参数提交到服务器进行验证,如何防止提交的请求不被抓包后串改,虽然无法说绝对安全却给非法提交提高了难度...

4219
来自专栏菩提树下的杨过

Flash/Flex学习笔记(23):运动学原理

先写一个公用的小球类Ball: package{ import flash.display.Sprite; //小球 类 public class B...

27310

扫码关注云+社区