rounding - Ada 2012 - 用定制版本替换 Fixed_Decimal_Type'Round()?
问题描述
最近,我在为自定义记录类型提供自己的替换'Write ()
过程时取得了巨大的成功,例如......
type Pixel_Format is
record
-- blah blah
end record;
procedure Pixel_Format_Write (
Stream : not null access Root_Stream_Type'Class;
Item : in Pixel_Format);
for Pixel_Format'Write use Pixel_Format_Write;
在写入网络流时,我使用它来将某些记录成员从小端转换为大端。工作得很漂亮。
出于同样的想法,我想知道是否可以替换'Round ()
小数定点类型的功能,所以我尝试了一个快速而肮脏的测试......
-- This is a "Decimal Fixed Point" type
type Money_Dec_Type is delta 0.001 digits 14;
-- ...
function Money_CustomRound(X : in Money_Dec_Type)
return Money_Dec_Type'Base;
for Money_Dec_Type'Round use Money_CustomRound; -- COMPILER COMPLAINS HERE
-- ...
function Money_CustomRound(X : in Money_Dec_Type)
return Money_Dec_Type'Base is
begin
return 0.001;
end Money_CustomRound;
唉,GNAT 觉得这很冒犯:
attribute "Round" cannot be set with definition clause
问题:
我在尝试不可能的事情吗?或者有没有办法改变默认'Round
属性,就像改变'Write
是可能的一样?
问题的背景:
我有一组大约 15 种不同的四舍五入货币值的方法,这些方法从一个项目到另一个项目(有时在同一个项目中!)。示例包括:
- 从零开始取整(似乎是 Ada 的默认值)
- 向零取整
- 统计(需要全局管理的可重入类型)
- 向偶数或赔率四舍五入
- 向 +INF / -INF 舍入
- ...
通过使用在通用包级别定义的某些舍入方法,能够使这种功能对程序员透明,这将是一个强大的工具。
我另一个肩膀上的天使暗示我在要求一些完全疯狂的东西。
我想知道这是因为文档(ALRM 和“Barnes 2012”)都给出了默认过程的功能规范。如果一个人不能用自己设计的另一个代替它,他们为什么要这样做?
解决方案
推荐阅读
- php - 从 Laravel 中保存在单列中的数组中获取值
- mongodb - MongoDB 在两个不同的集合中更新和插入
- javascript - 如何为存储对象的数组创建循环?
- mfc - 如何检测 CWnd* 是 CListCtrl 还是 CEdit ...?
- swift - Tableview 禁用单元格中的用户交互
- python - 将整个整数数组转换为对象
- php - 在哪种情况下我们可以使用插值算法搜索而不是二分搜索算法?
- spring-boot - gradle项目中无法识别Spring-boot application.properties
- linux - 即使在插入证书后也指向 HTTP 的永久链接
- r - 为 R 中的多个表指定导入顺序