判断两个双精度浮点数是否整除!

  这几天在开发公司项目中,由于属于期货产品,所以在此过程中遇到价格和最小单位价格的除法计算。

众所周知浮点数在计算机中为近视值。比如价格,客户端输入的价格为145.5,但是我的服务端断点显示为145.49999999999998。

当然从CTP服务器(期货那边的服务器)最小单位价格实为0.5,但是断点显示为0.50000000000003。所以利用fomd()函数的方法

变落空了。

这里提一下

函数名: fmod
功 能: 计算x对y的模, 即x/y的余数
用 法: double fmod(double x, double y);

我的本意利用这个函数验证值是否为零来判断是否整除。但是由于精度问题无法实现。

所以,首先我想到了一个方法,就是取浮点的小数点后6位有效数字,后面的四舍五入。

算法是这样的:

double sswr(double x, int n)
{
double temp = x * pow(10.0,-n);
temp = floor(temp +0.5);
return (temp * pow(10.0,n));
}

这样算法的原理是浮点数先乘于10的n次方 然后加0.5 然后取整数部分 再除以10的n次方。

按理我的想法这个原理可行,随后我进行了判断代码如下:

if((fabs(fmod(sswr(fabs(orderfield.Order_Field.LimitPrice - it_DepthMarket->second.AskPrice1),-7),sswr(it_InstrumentField->second.PriceTick,-7))) > FLT_EPSILON)

按道理说这个方法可行,但是当我测试的时候 发现却不是这样 发现符合条件的LimitPrice却无法通过条件验证 ,这个问题我一直很纠结,找不到问题。希望大神可以帮我解惑。

既然这个方法行不通。最后我利用了一个简单粗暴的方法,就是浮点数转换成整数,进行处理这样就简单多了。代码如下

unsigned long long Limit_Price = (orderfield.Order_Field.LimitPrice*100000 + 0.9);
unsigned long long Prcie_Tick = (it_InstrumentField->second.PriceTick*100000 + 0.9);
if (0 != Limit_Price % Prcie_Tick)

这样浮点数转成整数时 自动取整数部分并且实现了四舍五入,由于浮点数为五位数 六位数(再乘于100000) 为了防止整数类型溢出,所以我用了 long long 类型。这样就简单的解决了这个问题。

时间: 2024-10-16 03:14:50

判断两个双精度浮点数是否整除!的相关文章

不能用==判断两个浮点数相等

在判断两个浮点数 a 和 b 是否相等时,不要用 a==b,应该判断二者之差的绝对值fabs(a-b) 是否小于某个阈值,例如 1e-9. ////在判断两个浮点数 a 和 b 是否相等时,不要用 a==b,应该判断二者之差的绝对值 ////fabs(a - b) 是否小于某个阈值,例如 1e-9. //#include <stdio.h> //#include <math.h> //#define EPSILON 0.000001 //int main() //{ // floa

【转】单双精度浮点数的IEEE标准格式

原文网址:http://blog.chinaunix.net/uid-24118190-id-75212.html 单双精度浮点数的IEEE标准格式 关键字:浮点数 IEEE标准 大多数高级语言按照IEEE-754标准来规定浮点数的存储格式.IEEE-754规定 单精度浮点数用4字节存储,双精度浮点数用8字节存储,表示为三部分:符号位.阶和尾数. S+E+MS 符号位,尾数的符号位:E 阶,即指数:M 尾数,即有效小数位数: 单精度格式符号位 1位, bit31阶     8位,bit30~23

判断整数是否能被n整除

(1)1与0的特性:         1是任何整数的约数,即对于任何整数a,总有1|a.         0是任何非零整数的倍数,a≠0,a为整数,则a|0. (2)若一个整数的末位是0.2.4.6或8,则这个数能被2整除. (3)若一个整数的数字和能被3整除,则这个整数能被3整除. (4) 若一个整数的末尾两位数能被4整除,则这个数能被4整除. (5)若一个整数的末位是0或5,则这个数能被5整除. (6)若一个整数能被2和3整除,则这个数能被6整除. (7)若一个整数的个位数字截去,再从余下的

如何判断两个对象相等

前言 虽然标题写的是如何判断两个对象相等,但本篇我们不仅仅判断两个对象相等,实际上,我们要做到的是如何判断两个参数相等,而这必然会涉及到多种类型的判断. 相等 什么是相等?在<JavaScript专题之去重>中,我们认为只要 === 的结果为 true,两者就相等,然而今天我们重新定义相等: 我们认为: NaN 和 NaN 是相等 [1] 和 [1] 是相等 {value: 1} 和 {value: 1} 是相等 不仅仅是这些长得一样的,还有 1 和 new Number(1) 是相等 'Cu

matlab 判断两个矩阵是否相等

数学意义的相等 all(A(:) == B(:)) isequal(A, B) 但须注意的是:B = A,未必能保证 isequal(A, B)返回真,因为如果 A 中包含NaN,因为按照定义,NaN ~= NaN >> A = [1, NaN] >> B = A >> isequal(A, B) 0 >> NaN == NaN 0 1 2 3 4 5 6 7 浮点数相等 对于浮点数矩阵,判断两个矩阵是否精确相等意义不大,真正有意义的比较是比较两个矩阵是否足

java 判断两个时间相差的天数!

package com.datedaycha;     import java.text.SimpleDateFormat;     import java.util.Calendar;     import java.util.Date;     import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException;     /*      * java 判断两个时间相差的天数     1.实现目标     输入:两

UIColor延伸:判断两个颜色是否相等

不管UIColor使用CIColor,CGColor还是其他方式初始化的,其CGColor属性都是可用的.CoreGraphics中提供一个函数,用于判断两个CGColor是否相等,因此我们可以通过这个函数判断两个UIColor是否相等,下面是看一个简单的例子: // 判断两个颜色是否是同一种颜色if (CGColorEqualToColor([UIColor whiteColor].CGColor, [UIColor colorWithRed:1 green:1 blue:1 alpha:1]

如何判断两个日期在一周内

如何判断两个日期在一周内,首先,需要搞清楚一周内到底是什么含义,国内通常是以周一作为每周的第一天,而西方普遍以周日作为每周的第一天. 以下,我们以西方的标准来处理这个问题. 常见的日期结构: struct DateTime { int year; int month; int day; int weekday; //days since Sunday - [0, 6] int hour; int minute; int second; }; 上述结构中与周相关的参数只有weekday,应该设法利

请编写一个程序,该程序可以接收两个数,并判断两个数是大于、小于、等于?

//作者:janushu //日期:2017/9/20 //功能判断两个数的大小 import java.io.*; public class CompareToNumDemo{ public static void main(String[] args){ try{ //输入流 从键盘上输入一个数 InputStreamReader isr = new InputStreamReader(System.in); //缓存读取一个数 BufferedReader br = new Buffere