乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 36|回复: 6

[编程交流] 将数字四舍五入到最近值

[复制链接]

180

主题

639

帖子

463

银币

中流砥柱

Rank: 25

铜币
897
发表于 2022-7-5 22:58:54 | 显示全部楼层 |阅读模式
我今天一直在玩弄一些东西,但似乎找不到正确的代码,它将接受一个数字并将其四舍五入到最接近的1/2“。只有当它首先不是一个整数时。
 
3" = 3"
3.25" = 3.5"
4" = 4"
4.625" = 5"
 
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-5 23:15:22 | 显示全部楼层
粗略方法:
  1. (defun Round05( theNumber / theRem )
  2. (setq theRem (rem theNumber 1))
  3. (cond
  4. ((= theRem 0.0)                         theNumber)
  5. ((and (> theRem  0.0)  (< theRem 0.25)) (* (fix theNumber) 1.0))
  6. ((and (>= theRem 0.25) (< theRem 0.75)) (+ (fix theNumber) 0.5))
  7. ((>= theRem 0.75)                       (+ (fix theNumber) 1.0))
  8. )
  9. )

也可以进一步细化以适用于负值。
回复

使用道具 举报

180

主题

639

帖子

463

银币

中流砥柱

Rank: 25

铜币
897
发表于 2022-7-5 23:26:35 | 显示全部楼层
MSasu,
 
非常感谢。我在VB中创建了一个很好的函数。NET在几周前完成了这项工作,但在将其应用于LISP时遇到了一些困难。这非常有效。
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-5 23:38:14 | 显示全部楼层
很高兴听到这对你有用;不客气!
出于好奇,有什么东西不能从VB代码中翻译出来?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 23:42:58 | 显示全部楼层
另一个版本也接受否定:
 
  1. ;; Round Up  -  Lee Mac
  2. ;; Rounds 'n' up to the nearest 'm'
  3. (defun LM:roundup ( n m )
  4.    (cond ((equal 0.0 (rem n m) 1e- n)
  5.          ((< n 0) (- n (rem n m)))
  6.          ((+ n (- m (rem n m))))
  7.    )
  8. )
  1. _$ (LM:roundup 3 0.5)
  2. 3
  3. _$ (LM:roundup 3.25 0.5)
  4. 3.5
  5. _$ (LM:roundup 4 0.5)
  6. 4
  7. _$ (LM:roundup 4.625 0.5)
  8. 5.0
回复

使用道具 举报

VVA

1

主题

308

帖子

308

银币

初来乍到

Rank: 1

铜币
8
发表于 2022-7-5 23:52:06 | 显示全部楼层
另一个版本
  1. (defun round (num prec)
  2. (* prec
  3.     (if (minusp num)
  4.       (fix (- (/ num prec) 0.5))
  5.       (fix (+ (/ num prec) 0.5))
  6.     )
  7. )
  8. )
回复

使用道具 举报

180

主题

639

帖子

463

银币

中流砥柱

Rank: 25

铜币
897
发表于 2022-7-6 00:01:18 | 显示全部楼层
谢谢大家。我现在有很多函数。我将修补转换我的VB。NET代码。我稍后会发布结果。
 
VB。网络代码
  1. ' This handles any non-integer input and rounds the user's input up to the nearest vDenominator
  2. ' In this case we use 1/16" and it remember it rounds up, not down.
  3.    Public Function RoundFraction(ByVal x As Double, ByVal vDenominator As Integer) As Double
  4.        If (x - Int(x)) * vDenominator <> Int((x - Int(x)) * vDenominator) Then
  5.            x = (Int((x - Int(x)) * vDenominator) + 1) / vDenominator + Int(x)
  6.        End If
  7.        Return x
  8.    End Function

 
我这样称呼它:
  1.   RoundFraction(4.4231, 16)

结果是4.4375。这纠正了当用户输入一个奇怪的维度,该维度至少足够接近他们想要的。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-11 03:34 , Processed in 0.351213 second(s), 66 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表