cadsterdyne 发表于 2022-7-5 17:18:30

Autolisp中的小数和数学

嗨,论坛。
 
这是一个实践代码,作为参考,我在旁边有excel计算。
 
问题
 
1.autocad输出中缺少小数(“rtos或.0”用于获取我知道的小数,但不知道如何在这里实现。我得到了错误)
 
2.在这种情况下,计算结果不符合68岁以上的年龄。
 
(defun C:mathfun()
(setq intAge (getint "\n Enter Your Age : "))
        (setq intdays (* intage 365))
                (setq intweeks ( / intdays 7))
                        (setq intmonths ( / intdays 30))
                                (setq inthours (* intdays 24))
                                        (setq intmins (* inthours 60))
                                                (setq intsecs (* intmins 60))
        (princ (strcat "\n You are " (itoa intdays) " Days Old!"))
                (princ (strcat "\n Your are " (itoa intweeks) " Weeks Old!"))
                        (princ (strcat "\n Your are " (itoa intmonths) " Months Old!"))
                                (princ (strcat "\n Your are " (itoa inthours ) " Hours Old!"))
                                        (princ (strcat "\n Your are " (itoa intmins ) " Minutes Old!"))
                                                (princ (strcat "\n Your are " (itoa intsecs ) " Seconds Old!"))
(Princ)
)
 
非常感谢。

年龄代码。图纸

cadsterdyne 发表于 2022-7-5 17:23:10

(defun C:mathfun1()
(setq intAge (getint "\n Enter Your Age : "))
        (setq intdays (rtos (* intage 365.0) 2 )
                (setq intweeks (rtos ( / intdays 7.0) 2 )
                        (setq intmonths (rtos ( / intdays 30.0) 2 )
                                (setq inthours(rtos (* intdays 24.0) 2 )
                                        (setq intmins(rtos (* inthours 60.0) 2 )
                                                (setq intsecs( rtos (* intmins 60.0) 2 )
        (princ (strcat "\n You are " (itoa intdays) " Days Old!"))
                (princ (strcat "\n Your are " (itoa intweeks) " Weeks Old!"))
                        (princ (strcat "\n Your are " (itoa intmonths) " Months Old!"))
                                (princ (strcat "\n Your are " (itoa inthours ) " Hours Old!"))
                                        (princ (strcat "\n Your are " (itoa intmins ) " Minutes Old!"))
                                                (princ (strcat "\n Your are " (itoa intsecs ) " Seconds Old!"))
(Princ)
)
 
我尝试使用rtos获取小数,但出现了错误。
 
Autocad命令行
 
命令:MATHFUN1
输入您的年龄:68岁
; 错误:错误的参数类型:numberp:“24820.00000000”
命令:

Roy_043 发表于 2022-7-5 17:29:35

看看这个:
(/ 6 3) => 2
(/ 7 3) => 2
(/ 7.0 3) => 2.33333
(/ 7 3.0) => 2.33333

(float 3) => 3.0

Lee Mac 发表于 2022-7-5 17:34:35

 
考虑用于每个表达式的数据类型:
 
rtos将数值转换为字符串。
itoa将整数转换为字符串。
 
算术计算中只能使用数值(请考虑intdays变量是字符串)。
 
从计算中删除rtos表达式,并在strcat表达式中用rtos替换itoa。

Lee Mac 发表于 2022-7-5 17:39:27

考虑以下因素:
(defun c:mathfun ( / age day )
   (initget 6)
   (if (setq age (getint "\nEnter your age: "))
       (princ
         (strcat "\nYou are: "
               "\n" (itoa (setq day (* age 365))) " days old."
               "\n" (rtos (/ day7.0) 2)         " weeks old."
               "\n" (rtos (/ day 30.0) 2)         " months old."
               "\n" (itoa (* day 24))             " hours old."
               "\n" (itoa (* day 24 60))          " minutes old."
               "\n" (itoa (* day 24 60 60))       " seconds old."
         )
       )
   )
   (princ)
)

Roy_043 发表于 2022-7-5 17:40:06

哎呀,无视我之前的帖子。我没有正确阅读OP。

David Bethel 发表于 2022-7-5 17:47:38

Yuo可能还想研究(rtos)转换的sysvar DIMZIN

BIGAL 发表于 2022-7-5 17:52:10

李有点搞笑(*365岁。有事)要考虑闰年。
 
22645.5或22630

cadsterdyne 发表于 2022-7-5 17:57:05


 
李先生,非常感谢你给我展示了如何把事情做好
我将查找更多示例,以研究itoa和rtos
 
抱歉,出现了另一个问题,请在年龄超过68岁后查看所附图像。在autolisp中,年龄(秒)的输出错误,它们变为负值,并且是错误的值。

cadsterdyne 发表于 2022-7-5 17:59:07

当然,大卫·贝瑟尔。谢谢你的指导。
页: [1] 2
查看完整版本: Autolisp中的小数和数学