AnsiStirng 类型数据相减

老白猫 2012-04-18 09:55:24

AnsiString we = "123456.1234";
AnsiString wr = "1.123";
we = we-wr;
ShowMessage(we); //123455.0004



AnsiString we = "123456789123456.1234";
AnsiString wr = "1.123";
we = we-wr;
ShowMessage(we); // 123456789123455


数据短的时候正常,数据大了小数点后面就没有了 这怎么办,丢失精确度了,这个是什么原因,怎么处理啊
...全文
172 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
老白猫 2012-04-19
  • 打赏
  • 举报
回复

感谢了,晚上为个问题亲手敲代码 ~
tengguanbing 2012-04-19
  • 打赏
  • 举报
回复
AnsiString c = "123456789123456.9";
AnsiString d = "123456789012345.9";

double b = StrToFloat(c.SubString(1,c.Pos(".")-1));
double a = StrToFloat(d.SubString(1,d.Pos(".")-1));

AnsiString e = c.SubString(c.Pos(".")+1,c.Length());
AnsiString f = d.SubString(d.Pos(".")+1,d.Length());
int len = e.Length()>f.Length()?e.Length():f.Length();
if(e.Length()!=f.Length())
{
if(e.Length()>f.Length())
{
for(int i =0;i<e.Length()-f.Length();i++)
{
f += "0";
}
}
else
{
for(int j =0;j<f.Length()-e.Length();j++)
{
e += "0";
}
}
}
AnsiString g = FloatToStr(StrToFloat(e)+StrToFloat(f));
AnsiString result;
if(g.Length()>len)
{
result = FloatToStr(a+b+1)+"."+g.SubString(2,g.Length());
}else
{
result = FloatToStr(a+b)+"."+g.SubString(1,g.Length());
}

ShowMessage(result);
老白猫 2012-04-19
  • 打赏
  • 举报
回复
好啦,一晚上安装楼上的思路终于搞定了 ,太墨迹了这些数据。。。。
tengguanbing 2012-04-19
  • 打赏
  • 举报
回复
编译器会用科学技术法来计数,我个人的建议,自己定义下
思路:分2部分计算 整数部分 和小数部分 然后拼接起来
老白猫 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

引用 12 楼 的回复:
不知道。。 但做的不能留危险的缝隙啊 万一呢 呢呢。。


总得有个限吧。你要是这样没限,那,啥程序也没法写。

真要那样,你就用字符串保存数值。想多长都可以。嘿,,,要加减乘除,就再写一个函数。
[/Quote]
是不是表示浮点数的字符串可以相减却不能相加对吧??
oldtab 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
不知道。。 但做的不能留危险的缝隙啊 万一呢 呢呢。。
[/Quote]

总得有个限吧。你要是这样没限,那,啥程序也没法写。

真要那样,你就用字符串保存数值。想多长都可以。嘿,,,要加减乘除,就再写一个函数。
老白猫 2012-04-19
  • 打赏
  • 举报
回复
怎么换 小数点乃
lhy 2012-04-19
  • 打赏
  • 举报
回复
转成64位整数。
老白猫 2012-04-19
  • 打赏
  • 举报
回复
不知道。。 但做的不能留危险的缝隙啊 万一呢 呢呢。。
lhy 2012-04-19
  • 打赏
  • 举报
回复
会有那么多位的金钱吗?津巴布韦币?
老白猫 2012-04-19
  • 打赏
  • 举报
回复
木错,各种检验都指向是精度问题,存储的字节数多了就果断给截掉了 这是个问题。。。 这个事关金钱啊,精确度没了是杀人啊
xjq2003 2012-04-19
  • 打赏
  • 举报
回复
应该是浮点数据显示精度的问题,vc好像没有这个问题,
目前 俺也无能为力***
ccrun.com 2012-04-18
  • 打赏
  • 举报
回复
转换成double类型再减吧。
老白猫 2012-04-18
  • 打赏
  • 举报
回复
long double 和 double 一样的这里
lhy 2012-04-18
  • 打赏
  • 举报
回复
转换成long double试试。
老白猫 2012-04-18
  • 打赏
  • 举报
回复
不懂 不懂 不明白 数据太长了? 长数据没法处理了?
老白猫 2012-04-18
  • 打赏
  • 举报
回复
换了也不清楚啊 上面代码就是
rickys2080 2012-04-18
  • 打赏
  • 举报
回复
转换成double类型再减吧。
老白猫 2012-04-18
  • 打赏
  • 举报
回复

double c = 123456789123456.1234;
double d = 123456789012345.0123;
ShowMessage(c); // 123456789123456
ShowMessage(c-d); // 111111.109375..


AnsiString c = "123456789123456.1234";
AnsiString d = "123456789012345.0123";
double ce = StrToFloat(c);
double de = StrToFloat(d);
ShowMessage(c); // 123456789123456.1234
ShowMessage(c-d); // 111111.109375 ..
ShowMessage(ce); // 123456789123456
ShowMessage(de); // 123456789012345
ShowMessage(ce-de);// 111111.109375


怎么弄都不对

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧