分数的比较。不会有精度的丢失的情况。
一般数学上在比较2个分数大小的时候,有2种方法:
(1)一般是先通分,再比较分子。
但是,通分时需要2个分数的分母直接相乘(或是通分为最小公倍数),但是,有可能溢出整数的范围,所以这种方法不靠谱。
(2)直接分别求出值(可能是浮点数),再直接比较。
但是,将分子分母使用除法/得出商,有时候又恐怕商精度不够。
某些情况下,2个分数本身不相等,但直接求浮点值后,由于浮点数的精度范围有限,浮点数的数值是相等的。
这里的最好的方法是:使用compare方法。思想是:辗转交换方法(我自起的名字)!
例如比较compare(5/18,3/11)=compare(11/3,18/5)=compare(2/3,3/5)=compare(5/3,3/2)=compare(2/3,1/2)=compare(2/1,3/2)=1
/**
* 分数比较。
*
*/
public class FenShuBijiao {
public static void main(String[] args) {
//使用compare方法
System.out.println(compare(1,3,2,3));// 1/3 < 2/3 :-1
System.out.println(compare(1,3,-2,3));// 1/3 > -2/3 :1
System.out.println(compare(3,11,5,18));// 3/11 < 5/18 :-1
System.out.println(compare(11,3,18,5));// 11/3 > 18/5 :1
int bigNum = (-1 >>> 1) - 50;
System.out.println("bigNum="+bigNum);
System.out.println(compare(bigNum-1,bigNum , bigNum , bigNum+1));// (bigNum-1)/bigNum < bigNum/(bigNum+1):-1
//使用除法/,比较符(精度丢失的情况)
System.out.println(0.12345678901234567890 == 0.12345678901234567890000000000001);//true
System.out.println(0.12345678901234567890 > 0.12345678901234567890000000000001);//false
System.out.println(0.12345678901234567890 < 0.12345678901234567890000000000001);//false
}
/**
* 输入2个分数,比较大小。0表示等于关系,1表示大于关系,-1表示小于关系。<br>
*
* 一般数学上在比较2个分数大小的时候,一般是先通分,再比较。<br>
* 例如:比较a/b,c/d大小,则可以通分,比较ad/bd,bc/bd的大小,转化为比较ad和bc的大小。<br>
*
* 但是,ad和bc,有可能溢出整数的范围,所以这种方法不靠谱。必须使用另外一种方法:<br>
* 比较(5/18,3/11)=(11/3,18/5)=(2/3,3/5)=(5/3,3/2)=(2/3,1/2)=(2/1,3/2)=1 <br>
*
* 如果将分子分母使用除法/得出商,有时候又恐怕商精度不够,2个数不相等,但在精度范围内,数值相等也是存在的。
*/
public static int compare(int fenzi1,int fenmu1,int fenzi2,int fenmu2){
//确定2个数的正负符号,1表示正数,0表示负数
int fuhao1 = ~(fenzi1 ^ fenmu1)>>>31;
int fuhao2 = ~(fenzi2 ^ fenmu2)>>>31;
//如果符号不同,则可以直接知道比较结果
if(fuhao1==0 && fuhao2 ==1){
return -1;
}
if(fuhao1==1 && fuhao2 ==0){
return 1;
}
//如果符号相同且都为负
if(fuhao1==0 && fuhao2 ==0){
return compare(Math.abs(fenzi2), Math.abs(fenmu2), Math.abs(fenzi1), Math.abs(fenmu1));
}
//如果符号相同且都为正
//关于分子和分母的关系,共有9种情况
if(fenzi1 == fenmu1 && fenzi2 == fenmu2){
return 0;
}else if(fenzi1 == fenmu1 && fenzi2 > fenmu2){
return -1;
}else if(fenzi1 == fenmu1 && fenzi2 < fenmu2){
return 1;
}else if(fenzi1 > fenmu1 && fenzi2 == fenmu2){
return 1;
}else if(fenzi1 > fenmu1 && fenzi2 > fenmu2){
//分子都大于分母,则求出商和余数
int shang1 = fenzi1/fenmu1;
int yushu1 = fenzi1%fenmu1;
int shang2 = fenzi2/fenmu2;
int yushu2 = fenzi2%fenmu2;
if(shang1 == shang2){//如果商相等,再比价。例如(11/3,18/5)=(2/3,3/5)
return compare(yushu1, fenmu1, yushu2, fenmu2);
}else if(shang1 > shang2){
return 1;
}else{//(shang1 < shang2)
return -1;
}
}else if(fenzi1 > fenmu1 && fenzi2 < fenmu2){
return 1;
}else if(fenzi1 < fenmu1 && fenzi2 == fenmu2){
return -1;
}else if(fenzi1 < fenmu1 && fenzi2 > fenmu2){
return -1;
}else{//(fenzi1 < fenmu1 && fenzi2 < fenmu2)
//分子都小于分母,则分子分母反转,再比较。例如(5/18,3/11)=(11/3,18/5)
return compare(fenmu2, fenzi2, fenmu1, fenzi1);
}
}
}
效果:
-1
1
-1
1
bigNum=2147483597
-1
true
false
false
分享到:
相关推荐
UltraCompare 文件比较 已破解
UltraCompare是一款文件内容比较工具。著名的ultraedit公司出品的,可进行文本模式,文件夹模式以及二进制模式的比较,并且可以对比较的文件进行合并,同步等操作,支持撤消操作。拥有书签与收藏夹功能,可以设置过滤...
Compare用法Compare用法Compare用法Compare用法Compare用法Compare用法
编程建立一个简单的进程内服务,实现比较两个整数大小的功能。服务提供Int Compare(Int, Int)函数,输入两个整数,输出较大的整数。(用到了service)
我们都知道要备份 但当发生故障并需要将历史备份与当前备份进行比较时 会出现什么情况 这就是比较 合并 同步工具大显身手的时机 远程文件 您需要比较远程文件吗 使用 FTP SFTP 下载远程文件 执行比较 合并操作 ...
乐学坊,资源分享。文件比较的插件。ComparePlugin.v1.5.6.2.bin.zip。下载后,解压文件,把ComparePlugin.dll复制到Notepad++\plugins文件夹下面。...Compare是比较,clear result是清除上一次的结果。
主要用途是对比两个文件夹或者文件,并将差异以颜色标示,比较范围包括目录,文档内容等,在编程代码版本对比中使用非常方便,代码合并保存功能,也可以配合SVN作为插件使用,进行版本代码对比时非常清晰,希望对...
该文件里有2个压缩包:BC3ShellExFix.zip + BC4ShellExFix.zip,分别是Beyond compare3和Beyond compare4的右键菜单修复方法,具体如下: 这里介绍Beyond compare4,在32位PC机上的右键菜单修复方法: 1)先把BC4...
比较工具,用于比较任何文本文件,包括.c文件、.cpp文件、.h文件等,或者比较文件夹;Beyond Compare.zip 解压之后直接可以使用
一个免费的激光三维点云数据显示,处理,分析的格局英文版 (X64) 由于上传限制,这是第二个压缩包
Ultra Compare 专业文件比较工具 Ultra Compare 专业文件比较工具 Ultra Compare 专业文件比较工具
UltraCompare是一款文件内容比较工具。著名的ultraedit公司出品的,可进行文本模式,文件夹模式以及二进制模式的比较,并且可以对比较的文件进行合并,同步等操作,支持撤消操作。拥有书签与收藏夹功能,可以设置过滤...
Beyond Compare 4 是一款智能且专业的文件夹和文本比较工具,它可以帮助用户快速地比较和合并文件,找出差异,生成文件报告。以下是 Beyond Compare 4 中文版的入门教程。 主界面 Beyond Compare 4 中文版的主...
1、首先下载一个3M不到的Notepad++编程软件。 2、Compare插件的安装很简单 下载该“ComparePlugin.dll”文件后,复制到Notepad++安装目录下的\plugins目录即可。 ComparePlugin.dll文件百度云盘下载地址:...
UltraCompare Professional 是一款文件内容比较工具。可进行文本模式,文件夹模式以及二进制模式的比较,并且可以对比较的文件进行合并,同步等操作,支持撤消操作。拥有书签与收藏夹功能,可以设置过滤,的确是一款...
UltraCompare Pro(文件内容比较工具)
UltraCompare Professional 是一款文件内容比较工具。可进行文本模式,文件夹模式以及二进制模式的比较,并且可以对比较的文件进行合并,同步等操作,支持撤消操作。拥有书签与收藏夹功能,可以设置过滤,的确是一款...
UltraCompare二进制比较工具
UltraCompare(文件比较工具)的特色:可文本编辑,HTML编程,系统管理,远程文件,日常用途
compare it可以迅速比较两个文档的异同,并使用差异色标识出来,非常便于区分