写了一个函数,出错。帮忙看看。

icank 2003-01-08 01:20:10
function CutFloat(const Value: Extended; const Digits: Byte): Extended;
var
V1, LFactor: Extended;
V2: Int64;
begin
LFactor := IntPower(10, Digits);
V1 := Value * LFactor;
V2 := Trunc(V1);
V1 := V2 / LFactor;
Result := V1;
end;

用 CutFloat(100.51, 5) 调用,返回 100.51 正确。
但用 CutFloat(150.51, 5) 调用,返回的是 150.50999
V2 用的是 Int64 类型,15051000 并没有超出范围啊!怎么回事啊?
应该怎么样修改?
...全文
82 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxpbuaa 2003-01-10
  • 打赏
  • 举报
回复
Delphi已经有这个方法了:
procedure Str(X [: Width [: Decimals ]]; var S);
比如:

var
T: string;
begin
Str(100.51:0:5, T);
//T=100.51000
end;

—————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
—————————————————————————————————
singlesword 2003-01-09
  • 打赏
  • 举报
回复
function CutFloat(const Value: Extended; const Digits: Byte): Extended;
begin
var
Str1, Str2: string;
i, Count: integer;
begin
Str1 := FloatToStr(Value);
i := 1;
Count := -1;
while i<=Length(Str1) do
begin
Str2 := Str2 + Str1[i];
if Count > -1 then
Inc(Count);
if Count = Digits then
break;
if Str1[i] = '.' then
Count := 0;
Inc(i);
end;
Result := StrToFloat(Str2);
end;
singlesword 2003-01-09
  • 打赏
  • 举报
回复
呵呵,那个Temp是多余的,忘了删掉了。
singlesword 2003-01-09
  • 打赏
  • 举报
回复
这样吧?
function CutFloat(const Value: Extended; const Digits: Byte): Extended;
begin
var
Str1, Str2: string;
Temp: Extended;
i, Count: integer;
begin
Temp := IntPower(10, Digits) * Value;
Str1 := FloatToStr(Value);
i := 1;
Count := -1;
while i<Length(Str1) do
begin
Str2 := Str2 + Str1[i];
if Count > -1 then
Inc(Count);
if Count = Digits then
break;
if Str1[i] = '.' then
Count := 0;
Inc(i);
end;
Result := StrToFloat(Str2);
end;
fengjn 2003-01-09
  • 打赏
  • 举报
回复
转成字符串
然后copy
再转回数值
icank 2003-01-08
  • 打赏
  • 举报
回复
那么这个函数应该怎么写呢?

function CutFloat(const Value: Extended; const Digits: Byte): Extended;

截断实数,不舍取。如:
CutFloat(0.99999, 3) = 0.999
hfycl 2003-01-08
  • 打赏
  • 举报
回复
UP
singlesword 2003-01-08
  • 打赏
  • 举报
回复
trunc跟round好像都不行的。
前几天作一个报表时发现。
trunc(1.5)=2
而trunc(2.5)=2
round一样。
返回一个离得最近的偶数:(
tobelost 2003-01-08
  • 打赏
  • 举报
回复
UP
墨梅无痕 2003-01-08
  • 打赏
  • 举报
回复
Trunc()函数在截断一个浮点数时,好像进行了精度控制。
把Trunc()换成Round()函数吧。
源码链接: https://pan.quark.cn/s/a4b39357ea24 在本研究中,我们将详细研究如何借助Python执行数据可视化,旨在剖析2018年期间中国四个主要城市——北京、上海、广州以及深圳的空气质量状况。通过绘制反映空气质量指数(AQI)与细颗粒物(PM2.5)变化趋势的图表,我们能够深入理解这些大都市全年的空气环境质量,并明确评估其优良天气所占的比重。 我们必须首先进行数据准备工作。在当前提供的压缩文件内,名为"2018天气"的文件极有可能是数据来源,其中可能收录了涉及四个城市每日空气质量监测的详细信息。这些数据通常涵盖日期、城市名称、AQI数值、PM2.5含量等核心参数。在Python编程环境中,我们惯常运用pandas库来对这类结构化数据进行高效的处理和分析。 1. **数据导入与初步处理**: - 利用`pandas.read_csv()`方法来导入存储为CSV格式的数据资料。 - 数据整理:对数据中的空白项、非正常数值进行修正,保证数据的精确性。 - 调整日期字段的格式,确保其能够适用于时间序列分析的需求。 2. **数据深度分析**: - 针对每个城市的AQI和PM2.5数据执行统计性描述,例如计算平均值、中位数、标准偏差等指标。 - 确定空气质量良好天气的天数,即那些AQI值低于75(依据中国的空气质量评估标准)的日数。 3. **数据呈现**: - 运用matplotlib或seaborn工具绘制折线图,直观展示四个城市在2018年全年的AQI和PM2.5变化动态。 - 可通过采用不同的颜色方案和线条类型来区分不同城市的数据系列。 - 添加必要的图示元素,如日期坐标轴、城市名称标注、图表标题及图例说明,以提升图表的可读...

16,741

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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