math.abs() java_Java中使用Math.abs你入坑了?
一、前言
Math.abs函数是jdk中提供的一个用来返回入参绝对值的函数,也就是你输入一个负数,它会返回其对应绝对值正数,这个在大部分情况下是这样,但是特殊情况下,还是会返回负数,为何那?且往下看。
二、场景介绍
在数据库中当数据量比较大时,我们会把一个表分为多个分表,或者把一个库分为多个库,那么分表按照什么来分那?这里就有一个分表键的概念,比如用户信息表,可以按照用户id作为分表键,比如消息重试表,可以使用消息id来做。
当分表键是字符串时候,我们可以使用字符串的hash值作为分表键。比如我们有100个分表,那么我们可使用hash(分表键)%100取模,根据取模后的值确定当前记录放到哪个分表。
但是字符串的hash值有可能是负数,所以我们需要使用Math.abs取分表键hash值的绝对值%100。这样看起来很好,但是还是会有问题。
因为字符串的hash值是int类型的,所以会取Math.abs(int a)作为取绝对值函数,当a为0x80000000时候,我们会看到其结果为:-2147483648,竟然为负数,然后如果对100取模,则会得到-48,根据-48则我们无法找到对应的分表,因为分表后缀为0-99,所以会出错。
为何会出现上面问题那?其实Math.abs(int a)函数注释已经说明了:
Note that if the argument is equal to the value of Integer.MIN_VALUE, the most negative representable int value, the result is that same value, which is negative.
也就是如果参数是整数最小负数,则Math.abs(int a)方法会返回最小负数本身,那么该方法为啥这样做那。其实是因为最大正数为2147483647,而最小负数为-2147483648,对最小负数加绝对值后,已经超过了最大正正数所表达的范围。
那么如何解决那?第一我们可以使用Math.abs(long a)函数,也就是把hash值从整形转换为long型。第二我们可以对hash值做映射,如果hash值为正数最小负数则把其映射为一个固定的正数值即可。
三、总结
细节决定成败,多看,多思考,养成看源码,看使用的工具的注释的习惯,可以极大程度减少线上故障的可能。
math.abs() java_Java中使用Math.abs你入坑了?相关推荐
- number java_java中Number Math 类方法
package NumberAndMath; /** * Number and Math 方法 * @author Administrator * */ public class NumAndMath ...
- 伊洛纳登录显示服务器连接中,伊洛纳萌新入坑常见问题汇总
伊洛纳萌新入坑常见问题汇总,很多玩家对一些入坑时遇到的问题不是很明白小编将问题做了一个汇总,有需要的玩家一定记得看看哦!快来看看本期的伊洛纳萌新入坑常见问题汇总吧! Q:为什么要读取电话权限? 我们采 ...
- java mod %区别_Java中 % 与Math.floorMod() 区别详解
%为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...
- java math 函数_Java中Math类常用函数总结
Java中比较常用的几个数学公式的总结: //取整,返回小于目标函数的最大整数,如下将会返回-2 Math.floor(-1.8): //取整,返回发育目标数的最小整数 Math.ceil() //四 ...
- c语言中math的库函数,C语言中math.h库中的常用函数
C语言中math.h库中的常用函数 int abs(int i) 返回整型参数i的绝对值 double cabs(struct complex znum) 返回复数znum的绝对值 double fa ...
- Java中的Math函数常用方法都在这里
Math函数中常用的一些方法 类Math包含用于执行基本数字运算的方法 算术运算 Math.abs(a):取a的绝对值 Math.sqrt(a):取a的平方根 Math.cbrt(a):取a的立方根 ...
- html实现log函数,math。h中的log函数的应用
以10为底的log函数: 形式为 double log10(double x) 以e为底的log函数(即 ln)double log (double x) 如何表达log 以a为底b的对数: 用换 ...
- Js中的Math对象
目录 1.什么是Math对象 2.Math的常用方法 Math.ceil() Math.floor() Math.random() Math.round() Math.sqrt() Math.pow( ...
- Java中的Math类相关方法整理
最近在复习java相关知识,今儿整理了一下Math类常用的方法-- Math类主要提供了一些执行数学基本运算的方法,如三角函数.指数函数.取整函数.最大值.最小值.绝对值.随机数等等,由于实际工作中, ...
- JS 中的Math方法向上取整、向下取整、保留整数、绝对值、取最大值、最小值等
JS 中的Math方法向上取整.向下取整.保留整数.绝对值.取最大值.最小值等 1.只保留整数部分(丢弃小数部分) parseInt(5.1234);// 5 2.向下取整(<= 该数值的最大整 ...
最新文章
- 问一下,线程池里面到底该设置多少个线程?
- 话里话外:信息资源整合失败之痛(二)
- APPLE:疑问驱动下的学习与实践
- 34 多线程同步之Event
- 拓扑排序之变量序列代码
- Spring容器中导入组件方式
- 使用ArcGIS Server发布我们的数据
- ubuntu流量监控_linux - 实时流量监控
- 架构之Nginx(负载均衡/反向代理)
- weblogic简单介绍
- HTML+CSS+JavaScript仿京东购物商城网站 web前端制作服装购物商城 html电商购物网站
- SELinux audit2allow命令使用
- appstore ip地址
- 重磅!100位校高校教师晒工资,详细晒,全国各地!要进高校的博士们参考
- 邮箱传大文件怎样快_5款好用的企业邮箱推荐
- Chromium Embedded Framework (CEF) 介绍
- 记录使用git时出现Permission denied 问题的解决
- 【keepass】每次打开软件总是弹出指定的文件不存在,如何关闭和清除以前打开数据库的文件记录?
- 右键添加[显示、隐藏文件]
- 2020-CIKM-DisenHAN: Disentangled Heterogeneous Graph Attention Network for Recommendation